2013-10-29 54 views
9

我正在通過html助手和TagBuilder生成HTML文本框。如何添加沒有值的屬性

我們有方法TagBuilder.Attributes.Add(「鍵」,「值」)

但對於HTML5必需的屬性不需要值傳遞的,所以如果我通過空字符串,則具有所需值的輸出=「」

那麼如何在不傳遞值的情況下添加必需的屬性?

public static IHtmlString AppTextBox(this HtmlHelper helper, string model) 
    { 
     var input = new TagBuilder("input"); 
     input.Attributes.Add("class", "form-control"); 
     input.Attributes.Add("ng-model", model); 

     input.Attributes.Add("required",""); 

     return new MvcHtmlString(input.ToString(TagRenderMode.Normal)); 
    } 

回答

6

這也是有效傳遞屬性作爲值的名稱:

input.Attributes.Add("required", "required"); 
2

我對MVC 5測試,不知道舊的版本,但下面的你想要做什麼。

tagBuilder.MergeAttribute("required", string.Empty); 
1

不知道,如果你仍然需要一個答案,但最終我最後寫的是從基礎MVC標籤建設者派生新類。這沒什麼太複雜的,我懷疑可能會有一些邊緣情況,這並不能很好地處理,但從我到目前爲止的單元測試來看,它非常穩定。

internal class ValuelessAttributeTagBuilder : System.Web.Mvc.TagBuilder 
{ 
    public List<string> ValuelessAttributes { get; private set; } 

    public ValuelessAttributeTagBuilder(string tagName) : base(tagName) 
    { 
     ValuelessAttributes = new List<string>(); 
    } 

    public void AddValuelessAttribute(string value) 
    { 
     if(ValuelessAttributes.Contains(value)) 
      ValuelessAttributes.Add(value); 
    } 

    /// <summary> 
    /// Renders the HTML tag by using the specified render mode. 
    /// </summary> 
    /// 
    /// <returns> 
    /// The rendered HTML tag. 
    /// </returns> 
    /// <param name="renderMode">The render mode.</param> 
    public string ToString(TagRenderMode renderMode) 
    { 
     var sb = new StringBuilder(); 
     switch (renderMode) 
     { 
      case TagRenderMode.StartTag: 
       sb.Append('<').Append(this.TagName); 
       AppendAttributes(sb); 
       AppendValuelessAttributes(sb); 
       sb.Append('>'); 
       break; 
      case TagRenderMode.EndTag: 
       sb.Append("</").Append(this.TagName).Append('>'); 
       break; 
      case TagRenderMode.SelfClosing: 
       sb.Append('<').Append(this.TagName); 
       AppendAttributes(sb); 
       AppendValuelessAttributes(sb); 
       sb.Append(" />"); 
       break; 
      default: 
       sb.Append('<').Append(this.TagName); 
       AppendAttributes(sb); 
       AppendValuelessAttributes(sb); 
       sb.Append('>').Append(this.InnerHtml).Append("</").Append(this.TagName).Append('>'); 
       break; 
     } 
     return sb.ToString(); 
    } 

    private void AppendAttributes(StringBuilder sb) 
    { 
     foreach (KeyValuePair<string, string> keyValuePair in (IEnumerable<KeyValuePair<string, string>>)this.Attributes) 
     { 
      string key = keyValuePair.Key; 
      if (!string.Equals(key, "id", StringComparison.Ordinal) || !string.IsNullOrEmpty(keyValuePair.Value)) 
      { 
       string str = HttpUtility.HtmlAttributeEncode(keyValuePair.Value); 
       sb.Append(' ').Append(key).Append("=\"").Append(str).Append('"'); 
      } 
     } 
    } 

    private void AppendValuelessAttributes(StringBuilder sb) 
    { 
     foreach (var v in ValuelessAttributes) 
     { 
      var str = HttpUtility.HtmlAttributeEncode(v); 
      sb.Append(' ').Append(str); 
     } 
    } 
} 
相關問題