用于字段的ASP.NET MVC内联帮助程序

And*_*rei 4 c# asp.net-mvc html-helper expression-trees razor

我需要一个通用的内联帮助器来显示字段.

这是我目前的情况:

@helper DisplayField(Func<MyModel, string> field)
{
    if (string.IsNullOrWhiteSpace(field(Model)) == false)
    {
        <div class="row"> @field(Model) </div>     
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

@DisplayField(m => m.Name)
@DisplayField(m => m.PhoneNumber)
Run Code Online (Sandbox Code Playgroud)

我不知道如何在帮助器中显示Label(DisplayAttribute).请帮忙.

Dav*_*001 7

在页面顶部,添加for for System.Linq.Expressions,例如.

@using System.Linq.Expressions
Run Code Online (Sandbox Code Playgroud)

(或在web.config中添加此命名空间).

然后创建帮助器,它看起来像:

@helper DisplayField(Expression<Func<MyModel, string>> field)
{
    @Html.LabelFor(field)
    @Html.DisplayFor(field)
}
Run Code Online (Sandbox Code Playgroud)

你可以在那里添加额外的逻辑来检查空值等.你可能最好创建一个HtmlHelper,这样你可以使用泛型类型参数而不是上面的"MyModel"和"string".当我上次尝试时,无法将内联类型参数添加到内联帮助程序,例如.下面是不是有可能,除非这个功能已经添加:

@helper DisplayField<TModel, TValue>(Expression<Func<TModel, TValue>> field)
{
    @Html.LabelFor(field)
    @Html.DisplayFor(field)
}
Run Code Online (Sandbox Code Playgroud)

因此,要获得泛型方法,您将使用自定义HtmlHelper.去做这个:

  1. 创建如下文件:

    using System;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Mvc.Html;
    
    namespace MvcApplication1.HtmlHelpers
    {
        public static class HtmlHelpers
        {
            public static MvcHtmlString DisplayFieldFor<TModel, TValue>(
                this HtmlHelper<TModel> helper, 
                Expression<Func<TModel, TValue>> field)
            {
                var labelString = helper.LabelFor(field);
                var displayString = helper.DisplayFor(field);
    
                return MvcHtmlString.Create(
                    labelString.ToString() + 
                    displayString.ToString());
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在您的页面中,这样的事情的用法将是:

    @Html.DisplayFieldFor(m => m.Name)
    @Html.DisplayFieldFor(m => m.PhoneNumber)
    
    Run Code Online (Sandbox Code Playgroud)

您可能需要检查页面上的使用情况或将HtmlHelper的命名空间添加到web.config中.