2013-10-29 6 views
9

私はHTMLヘルパーとTagBuilderを通してHTMLテキストボックスを生成しています。我々は法TagBuilder.Attributes.Add(「キー」、「値」)値なしの属性を追加するには

を持っていますが、私は、空の文字列を渡すので、もしHTML5必要な属性のために、渡される値を必要としない

required = ""の値を持つ出力

値を渡さずに必須の属性を追加するにはどうすればよいですか?

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); 
     } 
    } 
} 
関連する問題