ASP.NET MVC剃刀:HTML中的条件属性

Mah*_*esh 75 asp.net-mvc razor asp.net-mvc-3

下面的代码看起来不干净.有什么改进代码的建议吗?

<li @if(ViewData["pagename"].ToString()=="Business details"){ <text>class="active" </text> } >
        <a  @if(ViewData["pagename"].ToString()=="Business details"){ <text>style="color: white; background-color: #08C; border: 1px solid #08C;" </text> }
            href="@Url.Action("BusinessDetails", "Business")">Business Details</a>
    </li> 
    <li @if (ViewData["pagename"].ToString() == "Booking policies"){ <text>class="active"</text> }> 
        <a  @if (ViewData["pagename"].ToString() == "Booking policies")
               { <text>style="color: white; background-color: #08C; border: 1px solid #08C;" </text> }
            href="@Url.Action("BookingPolicies", "Business")">Booking policies</a> 
    </li> 
Run Code Online (Sandbox Code Playgroud)

jcr*_*898 123

MVC内置了条件属性......

<div @{if (myClass != null) { <text>class="@myClass"</text> } }>Content</div>
<div class="@myClass">Content</div>
Run Code Online (Sandbox Code Playgroud)

如果@myClass为null,它根本就不会使用该属性...

我知道这可能无法解决您当前的问题,但值得注意的是!

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

  • 当调用通过匿名`htmlProperties`对象的html帮助程序时,有没有办法实现相同的尊重空行为?例如,我想有条件地传递属性`disabled`,例如`@ Html.TextBoxFor(lambda,new {disable = condition?true:null})`,但是当`disabled`为null时,它仍然呈现`disabled =“”`。 `,它与表示`disabled =“ anything”`相同,因为当属性存在时,无论值如何,“ disabled”都处于活动状态。找到了关于该主题的http://stackoverflow.com/q/7978137/11683,但是我现在想知道有更好的方法吗? (2认同)
  • 旁注:“数据-...”属性不能是有条件的,即使为空也不能呈现空值(http://stackoverflow.com/questions/13267619/razor-conditional-attribute-not-working) (2认同)

SLa*_*aks 72

<li class="@(ViewBag.pagename == "Business details" ? "active" : null)">  
Run Code Online (Sandbox Code Playgroud)

您应该style="..."使用单独的类名替换内联,并在那里使用相同的语法.

但是,创建一个单独的HTML帮助程序扩展方法更为清晰,该方法采用页面和操作名称并一般生成HTML.


def*_*ost 19

我使用一个小辅助方法,如果值非空,将有条件地添加一个属性,如果定义,当布尔函数表达式求值为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;
}
Run Code Online (Sandbox Code Playgroud)

一旦定义,我可以在我的Razor视图中使用此方法:

<li @(Html.Attr("class", "new", () => example.isNew))>
...
</li>
Run Code Online (Sandbox Code Playgroud)

<li class="new">...</li>如果example.isNew == true,如果不会省略整个class属性,上面的代码将呈现.


use*_*102 8

@{ var classAttr= needClass ? "class=\"class-name\"" : "" }
Run Code Online (Sandbox Code Playgroud)

然后在 HTML 中

<li @Html.Raw(classAttr) >  
Run Code Online (Sandbox Code Playgroud)


Dav*_*vík 5

在MVC4中

<!DOCTYPE html>
<html>
<head>
</head>
<body>
    @{
        string css = "myDiv";
    }
    <div class='@css'></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

或者

<!DOCTYPE html>
<html>
<head>
</head>
<body>
    @{
        string css = "class=myDiv";
    }
    <div @css></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

更多内容在这里:http://evolpin.wordpress.com/2012/05/20/mvc-4-code-enhancements/