如何在剃刀MVC 4中添加带有条件值的第二个CSS类


149

尽管微软已经在剃刀MVC4中创建了html属性的自动渲染,但是我花了很多时间才发现如何基于条件剃刀表达式在元素上渲染第二个CSS类。我想和你分享。

基于模型属性@ Model.Details,我想显示或隐藏列表项。如果有详细信息,则应显示div,否则应将其隐藏。使用jQuery,我要做的就是分别添加一个类show或hide。为了其他目的,我还想添加另一个类“ details”。因此,我的标记应该是:

<div class="details show">[Details]</div> 要么 <div class="details hide">[Details]</div>

下面,我展示了一些失败的尝试(假设没有详细信息,将导致加价)。

这:<div @(@Model.Details.Count > 0 ? "class=details show" : "class=details hide")>

将呈现此:<div class="details" hide="">

这:<div @(@Model.Details.Count > 0 ? "class=\"details show\"" : "class=\"details hide\"")>

将呈现此: <div class=""details" hide&quot;="">

这个: <div @(@Model.Details.Count > 0 ? "class='details show'" : "class='details hide'")>

将呈现此: <div class="'details" hide&#39;="">

这些都不是正确的标记。


如果您将所有第一个解决方案都包装在MvcHtmlString的新实例中或使用Html.Raw
Kyle

Answers:


301

我认为,视图上仍然存在有效的逻辑。但是对于这种我同意@BigMike的事情,最好放在模型上。话虽如此,该问题可以通过三种方式解决:

您的回答(假设这可行,我还没有尝试过):

<div class="details @(@Model.Details.Count > 0 ? "show" : "hide")">

第二种选择:

@if (Model.Details.Count > 0) {
    <div class="details show">
}
else {
    <div class="details hide">
}

第三种选择:

<div class="@("details " + (Model.Details.Count>0 ? "show" : "hide"))">

2
我接受了这个答案,因为它提供了比我更多的选择。
R. Schreurs 2014年

18
第二个选项导致错误The "div" element was not closed
intrepidis

6
当然,这里写的不是完整的代码,而是相关代码的一部分。谁知道div中还有多少其他元素;)
冯诉

没为我工作。我得到这个错误'ClubsModel' does not contain a definition for 'ClubsFilter' and no extension method 'ClubsFilter' accepting a first argument of type 'ClubsModel' could be found (are you missing a using directive or an assembly reference?)
马丁Erlic

您的问题与发布的问题有什么关系?
冯诉

69

这个:

    <div class="details @(Model.Details.Count > 0 ? "show" : "hide")">

将呈现此:

    <div class="details hide">

是我想要的加价标记


1
我不喜欢视图中有逻辑,即使它是微不足道的逻辑,我也更喜欢将ModelView对象与getDetailClass()方法一起使用。
2013年

29
我个人更喜欢琐碎的逻辑,拥有getDetailCssClass方法意味着您的模型知道您的View,从而破坏了这种抽象。我将在模型中添加一个HasDetails方法以减少视图中所需的逻辑,然后将css类逻辑留给视图,这意味着您不必使用乱扔视图@Model.Details.Count > 0。例如<div class="details @(@Model.HasDetails ? "show" : "hide")">
克里斯·迪弗

26

您可以按如下所示将属性添加到模型中:

    public string DetailsClass { get { return Details.Count > 0 ? "show" : "hide" } }

然后您的视图将更简单,并且完全不包含逻辑:

    <div class="details @Model.DetailsClass"/>

即使为许多类也可以使用,如果为null,则不会呈现类:

    <div class="@Model.Class1 @Model.Class2"/>

具有2个非null属性将呈现:

    <div class="class1 class2"/>

如果class1为null

    <div class=" class2"/>

11
我认为最好让视图定义诸如CSS类之类的东西。请记住,视图应该能够被深度修改(甚至替换)而不会影响视图模型
tobiak777 2015年

1
尽管我总体上同意reddy,但在某些情况下可以以syned所说的方式这样做是合理的。我就是那样做的。就我而言,我依赖于一个充满信息的ViewModel对象来渲染视图,而不仅仅是一个数据对象。
GonzaloMéndez'16

1
如果结果超过2个,我会这样使用。例如5个可能的类。比将它保持在可见状态要麻烦得多。
MateuszMigała'16

1
视图是正确的地方。将其很好地格式化为代码块中的变量分配,并且不会造成混乱。
汤姆·布洛杰特

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.