ASP.NET MVC razor: conditional attribute in HTML

后端 未结 7 1659
鱼传尺愫
鱼传尺愫 2020-12-02 15:21

Code below doesn\'t seems clean. Any suggestion to improve the code?

  • class=\
  • 相关标签:
    7条回答
    • 2020-12-02 15:30
      <li class="@(ViewBag.pagename == "Business details" ? "active" : null)">  
      

      You should replace the inline style="..." with a separate classname and use the same syntax there.

      However, it would be cleaner to make a separate HTML helper extension method that takes a page and action name and generates the HTML generically.

      0 讨论(0)
    • 2020-12-02 15:30

      I use a small helper method that will conditionally add an attribute if the value is non-empty, and, if defined, when a Boolean function expression evaluates to true:

      public static MvcHtmlString Attr(this HtmlHelper helper, string name, string value, Func<bool> condition = null)
      {
          if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(value))
          {
              return MvcHtmlString.Empty;
          }
      
          var render = condition != null ? condition() : true;
      
          return render ? 
              new MvcHtmlString(string.Format("{0}=\"{1}\"", name, HttpUtility.HtmlAttributeEncode(value))) : 
              MvcHtmlString.Empty;
      }
      

      Once defined, I can use this method in my Razor views:

      <li @(Html.Attr("class", "new", () => example.isNew))>
      ...
      </li>
      

      The above code will render <li class="new">...</li> if example.isNew == true, if not will omit the entire class attribute.

      0 讨论(0)
    • 2020-12-02 15:31

      Based on defrosts answer here an adaptation, taking an object instead of a string:

          public static MvcHtmlString ConditionalAttr(this HtmlHelper helper, string attributeName, object value, Func<bool> condition)
          {
              if (string.IsNullOrEmpty(attributeName) || value == null)
              {
                  return MvcHtmlString.Empty;
              }
      
              var render = condition != null ? condition() : true;
      
              return render ? 
                  new MvcHtmlString($"{attributeName}=\"{HttpUtility.HtmlAttributeEncode(value.ToString())}\"") : 
                  MvcHtmlString.Empty;
          }
      

      This way you don't have to turn your other datatypes in strings before passing them, saving a fiew .ToString(). There is a difference tho: passing an empty string will still render. As example:

      @Html.ConditionalAttr("data-foo", "", () => Model.IsFooNeeded)
      
      // Ouput:
      data-foo=""
      
      0 讨论(0)
    • 2020-12-02 15:34
      @{ var classAttr= needClass ? "class=\"class-name\"" : "" }
      

      and then in the HTML

      <li @Html.Raw(classAttr) >  
      
      0 讨论(0)
    • 2020-12-02 15:36

      MVC has conditional attributes built in...

      <div @{if (myClass != null) { <text>class="@myClass"</text> } }>Content</div>
      <div class="@myClass">Content</div>
      

      If @myClass is null, it just won't use the attribute at all...

      I know that may not quite solve your current issue, but it is noteworthy!

      http://weblogs.asp.net/jgalloway/archive/2012/02/16/asp-net-4-beta-released.aspx

      0 讨论(0)
    • 2020-12-02 15:37

      In MVC4

      <!DOCTYPE html>
      <html>
      <head>
      </head>
      <body>
          @{
              string css = "myDiv";
          }
          <div class='@css'></div>
      </body>
      </html>
      

      or

      <!DOCTYPE html>
      <html>
      <head>
      </head>
      <body>
          @{
              string css = "class=myDiv";
          }
          <div @css></div>
      </body>
      </html>
      

      More are here: http://evolpin.wordpress.com/2012/05/20/mvc-4-code-enhancements/

      0 讨论(0)
    提交回复
    热议问题