2013-10-29 21 views
9

Sto generando la casella di testo HTML tramite l'helper html e TagBuilder.Come aggiungere un attributo senza valore

abbiamo il metodo TagBuilder.Attributes.Add ("chiave", "valore")

ma per HTML5 attributo richiesto non ha bisogno valore da passare, così se passo stringa vuota, l'uscita con valore di required = ""

Quindi, come posso aggiungere l'attributo richiesto senza passare il valore?

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

risposta

6

E 'valido anche per passare il nome dell'attributo come valore:

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

ho testato su MVC 5, non è sicuro su versioni precedenti, ma il seguente fa quello che vuoi.

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

Non sono sicuro se hai ancora bisogno di una risposta a questa, ma alla fine ho finito per scrivere una nuova classe che deriva dalla base MVC tag costruttore. Non è niente di troppo complesso e ho il sospetto che ci possano essere alcuni casi limite che questo non gestisce troppo bene, ma dai test unitari che ho finora è abbastanza solido.

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