かみそりMVC 4で条件付き値を持つ2番目のCSSクラスを追加する方法


149

Microsoft がかみそりMVC4 でHTML属性のオートマジックレンダリングを作成しましたが、条件付きかみそり式に基づいて、要素に2番目のCSSクラスをレンダリングする方法を見つけるのにかなりの時間がかかりました。共有したいと思います。

モデルプロパティ@ Model.Detailsに基づいて、リストアイテムを表示または非表示にします。詳細がある場合はdivを表示し、それ以外の場合は非表示にする必要があります。jQueryを使用して、クラスshowまたはhideをそれぞれ追加するだけで済みます。他の目的のために、「詳細」という別のクラスも追加したいと思います。だから、私のマークアップは:

<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

回答:


301

ビューにはまだ有効なロジックが存在する可能性があると思います。しかし、@ BigMikeに同意するこの種のことについては、モデルに配置する方が適切です。問題は3つの方法で解決できると述べました:

あなたの答え(これがうまくいくと仮定して、私はこれを試していません):

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

2番目のオプション:

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

3番目のオプション:

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

2
私よりも多くのオプションを提供するので、私はこれを答えとして受け入れました。
R. Schreurs 2014

18
2番目のオプションが原因でエラーが発生するThe "div" element was not closed
intrepidis 2015

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?)
Martin Erlic、

あなたの問題は投稿された質問にどのように関連していますか?
フォン

69

この:

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

これをレンダリングします:

    <div class="details hide">

そして私が欲しいマークアップです。


1
私はビューにロジックがあるのが好きではありません。たとえそれが取るに​​足らないロジックであっても、私はgetDetailClass()メソッドでModelViewオブジェクトを使用することを好みます。
BigMike 2013年

29
個人的には簡単なロジックを好みます。getDetailCssClassメソッドを使用すると、モデルがビューを認識し、その抽象化を壊します。ビューに必要なロジックを減らすためにモデルにHasDetailsメソッドを追加してから、cssクラスロジックをビューに残します。つまり、でビューを散らかす必要はありません@Model.Details.Count > 0。例<div class="details @(@Model.HasDetails ? "show" : "hide")">
2013年

26

次のようにモデルにプロパティを追加できます。

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

すると、ビューがよりシンプルになり、ロジックがまったく含まれなくなります。

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

これは多くのクラスでも機能し、nullの場合はクラスをレンダリングしません。

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

nullでないプロパティが2つある場合、レンダリングされます。

    <div class="class1 class2"/>

class1がnullの場合

    <div class=" class2"/>

11
ビューにcssクラスなどを定義させた方がいいと思います。ビューは、ビューモデルに影響を与えずにdeply変更された(あるいは置き換え)することができなければならないことに注意してください
tobiak777

1
私は一般的にレディに同意しますが、synedが言うようにそれを行うことが正当化される場合があるかもしれません。私はまさにそのようにしました。私の場合、ビューをレンダリングするための情報でいっぱいのViewModelオブジェクトに依存しています。それは単なるデータオブジェクトではありません。
GonzaloMéndez16年

1
2つ以上の結果があった場合は、このように使用します。たとえば、5つの可能なクラス。それを表示しておくのは面倒です。
MateuszMigała16年

1
ビューは適切な場所です。コードブロック内の変数割り当てとして適切にフォーマットしてください。面倒なことはありません。
トムブロジェット2016年

3

String.Format関数を使用して、条件に基づいて2番目のクラスを追加できます。

<div class="@String.Format("details {0}", Details.Count > 0 ? "show" : "hide")">
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.