2013-10-29 15 views
9

Ich erzeuge HTML-Textbox über den HTML-Helfer und TagBuilder.Wie Attribut ohne Wert hinzufügen

haben wir die Methode TagBuilder.Attributes.Add („Schlüssel“, „Wert“)

aber für HTML5 erforderliches Attribut nicht Wert müssen weitergegeben werden, also wenn ich dann leeren String die Ausgabe mit Wert von erforderlich = ""

Also, wie füge ich erforderliche Attribut ohne den Wert übergeben?

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)); 
    } 

Antwort

6

Es ist auch gültig, den Namen des Attributs als Wert zu übergeben:

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

Ich habe auf MVC getestet 5, nicht sicher über ältere Versionen aber das folgende tut, was Sie wollen.

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

Nicht sicher, ob Sie noch eine Antwort auf diese Frage müssen, aber am Ende landete ich eine neue Klasse zu schreiben auf, die von der Basis MVC-Tag-Builder ableitet. Es ist nichts zu komplex und ich vermute, es gibt ein paar Randfälle, die das nicht so gut behandelt, aber von den Unit-Tests, die ich bis jetzt habe, ist es ziemlich solide.

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); 
     } 
    } 
}