ASP.NET MVC built-in helper for fields

I need a common built-in helper to display fields.

Here is what I have:

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

Using:

@DisplayField(m => m.Name)
@DisplayField(m => m.PhoneNumber)

I do not know how to show the Label (DisplayAttribute) inside the helper. Please, help.

+4
source share
2 answers

At the top of the page, add usage for System.Linq.Expressions, for example.

@using System.Linq.Expressions

(or add this namespace to web.config).

Then, to create an assistant, it will look something like this:

@helper DisplayField(Expression<Func<MyModel, string>> field)
{
    @Html.LabelFor(field)
    @Html.DisplayFor(field)
}

, .. , HtmlHelper, , "MyModel" "string", . , , . , :

@helper DisplayField<TModel, TValue>(Expression<Func<TModel, TValue>> field)
{
    @Html.LabelFor(field)
    @Html.DisplayFor(field)
}

, , HtmlHelper. :

  • :

    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());
            }
        }
    }
    
  • :

    @Html.DisplayFieldFor(m => m.Name)
    @Html.DisplayFieldFor(m => m.PhoneNumber)
    

... HtmlHelper web.config.

+7

@David_001 MVC-; , , , MVC .

Func<MyModel, string> Expression<Func<MyModel, string>>. , , , .
:

var compExpr = field.Compile();
var value = compExpr.DynamicInvoke(Model);

, :

var memberAccExpr = (System.Linq.Expressions.MemberAccessExpression)field.Body;
var attr = (DisplayAttribute)memberAccExpr.Member.GetCustomAttributes(typeof(DisplayAttribute), false).FirstOrDefault();

# ( MVC), , Razor; , .
, , . , , .

+1

All Articles