c# - 卡在 Razor 扩展上

标签 c# asp.net-mvc razor razor-declarative-helpers

我正在尝试将一些常用的代码重构为帮助程序扩展,但我对语法感到困惑,很大程度上是因为我没有完全掌握泛型、lambda 表达式等。

我希望能够将其放在我的 View 中,并让它使用我的模型的字段(例如 FirstName)来生成一些使用其他 Razor 扩展的 HTML:

@MyHelpers.BootstrapFormItem(m => m.FirstName)

目前我有:

@using System.Web.Mvc;
@using System.Web.Mvc.Html;
@using System.Linq;
@using System.Linq.Expressions;

@helper BootstrapFormitem(XXXXXXXXX) 
{
         <div class="control-group">
            @Html.LabelFor(XXXXXXX)
            <div class="controls">
               @Html.DisplayFor(XXXXX)
               @Html.ValidationMessageFor(XXXX)
            </div>
         </div>
}

问题:

  1. 这是正确的方法吗?我希望能够将此方法与任何 View 模型字段一起使用。
  2. 我是否包含了正确的命名空间?这将进入 app_code 文件夹
  3. XXXXXX 里有什么?

最佳答案

这个类可以满足您的需要,我一直使用这些:

using System;
using System.Linq.Expressions;
using System.Text;
using System.Web.Mvc;
using System.Web.Mvc.Html;

public static class HtmlHelpers
{
    public static MvcHtmlString BootstrapFormItem<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
    {
        StringBuilder html = new StringBuilder("<div class=\"control-group\">");
        html.AppendLine(helper.LabelFor(expression).ToString());
        html.AppendLine("<div class=\"controls\">");
        html.AppendLine(helper.DisplayFor(expression).ToString());
        html.AppendLine(helper.ValidationMessageFor(expression).ToString());
        html.AppendLine("</div>");
        html.AppendLine("</div>");
        return MvcHtmlString.Create(html.ToString());
    }
}

请注意,这是一个静态类,也是一个扩展方法,第一个输入参数以“this”为前缀,这意味着它将扩展(在智能感知中键入“.”后显示)任何类型为 HtmlHelper<TModel> 的对象。我通常会将此类放在 Utilities 文件夹中。我也经常使用命名空间并从 web.config 中引用它。

编辑回答问题:

这是用法,Intellisense 也涵盖了它:

@model MyClass

@Html.BootstrapFormItem(x => x.Name)

这是输出:

<div class="control-group">
    <label for="Name">Name</label>
    <div class="controls">
        naspinski
        <span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"/>
    </div>
</div>

关于c# - 卡在 Razor 扩展上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11634117/

相关文章:

c# - 在 C# 中即发即弃

c# - vs2008 c# : Facebook. rest.api 如何使用它获取好友列表?

asp.net-mvc - 如何在 ASP.NET 中使用带有自定义 session key 参数的 session

javascript - event.preventDefault() 和重定向 asp mvc/jQuery

c# - 如何在 C# 中的字典上实现 linq?

c# - Razor 页面中 VB.NET 的 @@<text> 标签问题

c# - 将 C++ 结构体转换为 C# 结构体

c# - 泛型类型的 Linq 类型转换

c# - 将 Viewmodel 中的枚举绑定(bind)到 MVC

jquery - 使用@url.action调用部分 View 点击使用jquery