【问题标题】:How to add attribute without value如何添加没有值的属性
【发布时间】:2013-10-29 21:41:33
【问题描述】:

我正在通过 html 助手和 TagBuilder 生成 HTML 文本框。

我们有方法 TagBuilder.Attributes.Add("key","value")

但是对于 HTML5 required 属性不需要传递值,所以如果我传递空字符串,那么输出值为 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));
    }

【问题讨论】:

    标签: asp.net-mvc razor


    【解决方案1】:

    将属性的名称作为值传递也是有效的:

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

    【讨论】:

      【解决方案2】:

      我在 MVC 5 上进行了测试,不确定旧版本,但以下是你想要的。

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

      【讨论】:

      • 可能有点挑剔,但这会导致<input required="" /> 而不是<input required /> 所以是的,它有效,但我仍然希望能够添加没有值的普通属性。
      【解决方案3】:

      不确定您是否还需要回答这个问题,但最后我编写了一个派生自基本 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);
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-02-04
        • 2015-02-26
        • 2015-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多