Converting ASP.NET MVC Razor @helper function into a method of a helper class

后端 未结 2 1131
难免孤独
难免孤独 2020-11-27 22:15

Consider the following ASP.NET MVC razor view snippet which defines a helper

@helper FieldFor(Expression> expr         


        
相关标签:
2条回答
  • 2020-11-27 22:37

    It should be quite easy. You need only write this as extension method of HtmlHelper and use TagBuilder to build your html:

    namespace Sample.Extensions
    {
        using System;
        using System.Linq.Expressions;
        using System.Web.Mvc;
        using System.Web.Mvc.Html;
    
        public static class TestExtensions
        {
            public static MvcHtmlString FieldFor<TModel>(
                                             this HtmlHelper<TModel> helper,
                                             Expression<Func<TModel, string>> expression)
            {
                var mainDiv = new TagBuilder("div");
                mainDiv.AddCssClass("form-group");
    
                mainDiv.InnerHtml += helper.LabelFor(expression);
    
                var colDiv = new TagBuilder("div");
                colDiv.AddCssClass("col-md-10");
                colDiv.InnerHtml += helper.EditorFor(expression, 
                                                     new
                                                     {
                                                        htmlAttributes =
                                                            new {@class = "form-control"}
                                                     })
                colDiv.InnerHtml += helper.ValidationMessageFor(
                                            expression, 
                                            "", 
                                            new {@class = "text-danger"});
    
                mainDiv.InnerHtml += colDiv;
    
                return new MvcHtmlString(mainDiv.ToString(TagRenderMode.Normal));
            }
        }
    }
    

    Usage in view:

    @using Sample.Extensions
    @model ...
    ...
    @Html.FieldFor(m => m.MyField)
    
    0 讨论(0)
  • 2020-11-27 22:40

    The signature would need to be

    public static MvcHtmlString FieldFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
    

    Then you use a combination of TagBuilder and the inbuilt html helper methods to generate the html

    using System;
    using System.Linq.Expressions;
    using System.Text;
    using System.Web.Mvc;
    using System.Web.Mvc.Html;
    
    namespace YourAssembly.Html
    {
      public static class FieldHelper
      {
        public static MvcHtmlString FieldFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
        {
          MvcHtmlString label = LabelExtensions.LabelFor(helper, expression, new { @class = "control-label col-md-2" });
          MvcHtmlString editor = EditorExtensions.EditorFor(helper, expression, new { htmlAttributes = new {@class = "form-control"}})
           MvcHtmlString validation = ValidationExtensions.ValidationMessageFor(helper, expression, null, new { @class = "text-danger" });
    
           StringBuilder html = new StringBuilder();
           html.Append(editor);
           html.Append(validation);
           TagBuilder innerDiv = new TagBuilder("div");
           innerDiv.AddCssClass("col-md-10");
           innerDiv.InnerHtml = html.ToString();
           html = new StringBuilder();
           html.Append(label);
           html.Append(innerDiv.ToString());
           TagBuilder outerDiv = new TagBuilder("div");
           outerDiv.AddCssClass("form-group");
           outerDiv.InnerHtml = html.ToString();
           return MvcHtmlString.Create(outerDiv.ToString());
        }
      }
    }
    

    Then your can make it available in all you views by adding it to web.config

    <system.web.webPages.razor>
      <pages pageBaseType="System.Web.Mvc.WebViewPage">
        <namespaces>
          <add namespace="System.Web.Mvc" />
          ....
          <add namespace="YourAssembly.Html" />
        </namespaces>
    
    0 讨论(0)
提交回复
热议问题