【问题标题】:ASP.Net MVC Html.Label with Attribute List?带有属性列表的 ASP.Net MVC Html.Label?
【发布时间】:2010-09-06 16:00:01
【问题描述】:

如何为接受属性的 Html.Label 创建 ASP.Net MVC Helper?

目前,当我定义一个 Html.TextBox 时,我可以传入一个属性列表。如下图:

new {disabled="disabled", @class="pcTextBoxWithoutPaddingDisabled"})%> 

但是,看起来 Html.Label 不具有此功能。因此,我必须使用标签标签来定义我的标签。如下图:

<label class="pcLabelBlackWithoutPadding">

我希望与我的 Html 元素的创建方式保持一致。

那么,如何创建一个包含属性列表的 Html.Label?

感谢您的帮助。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    这是 MVC3 的更新版本:

    public static MvcHtmlString Label(this HtmlHelper helper, String htmlFieldName, String labelText, Object htmlAttributes)
    {
        ModelMetadata metadata = ModelMetadata.FromStringExpression(htmlFieldName, helper.ViewData);
    
        String innerText = labelText ?? (metadata.DisplayName ?? (metadata.PropertyName ?? htmlFieldName.Split('.').Last()));
    
        if (String.IsNullOrEmpty(innerText))
        {
            return MvcHtmlString.Empty;
        }
    
        TagBuilder tagBuilder = new TagBuilder("label");
        tagBuilder.Attributes.Add("for", TagBuilder.CreateSanitizedId(helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)));
        tagBuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
        tagBuilder.SetInnerText(innerText);
    
        return new MvcHtmlString(tagBuilder.ToString(TagRenderMode.Normal));
    
    }
    

    【讨论】:

      【解决方案2】:

      我已经用 lambda 表达式稍微修改了 Alexandr 代码,以防有人需要 lambda 表达式。

      用法:

      @Html.LabelFor(model => model.Property , new { @class = "bigFont" })
      

      代码:

      public static MvcHtmlString LabelFor<TModel, TProperty>(
              this HtmlHelper<TModel> htmlHelper,
              Expression<Func<TModel, TProperty>> expression, Object htmlAttributes)
          {
              var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
      
              var innerText = metadata.DisplayName ?? metadata.PropertyName;
      
              if (String.IsNullOrEmpty(innerText))
              {
                  return MvcHtmlString.Empty;
              }
      
              var tagBuilder = new TagBuilder("label");
              tagBuilder.Attributes.Add("for", TagBuilder.CreateSanitizedId(htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(metadata.PropertyName)));
              tagBuilder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
              tagBuilder.SetInnerText(innerText);
      
              return new MvcHtmlString(tagBuilder.ToString(TagRenderMode.Normal));
          }
      

      【讨论】:

        【解决方案3】:

        我建议创建您自己的 HtmlHelper 扩展方法并使用 TagBuilder 来创建标签。

         public static HtmlHelperExtensions
         {
              public static Label( this HtmlHelper helper, string labelText, object properties )
              {
                   var builder = new TagBuilder("label");
                   builder.MergeAttributes( new RouteValueDictionary( properties ) );
                   builder.SetInnerText( labelText );
                   return builder.ToString( TagRenderMode.Normal );
              }
         }
        

        有关如何创建强类型标签助手的想法,请参阅 MVC source code。请注意,您需要将包含扩展的命名空间添加到页面或 web.config 才能使用它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-15
          • 1970-01-01
          相关资源
          最近更新 更多