使い方 ?:Razorおよびインラインコードブロックを含むifステートメント


154

新しいRazoreビューエンジンで古い.aspxビューを更新しています。私はこのようなコードがある場所がたくさんあります:

<span class="vote-up<%= puzzle.UserVote == VoteType.Up ? "-selected" : "" %>">Vote Up</span>

理想的にはこれを行いたいです:

<span class="vote-up@{puzzle.UserVote == VoteType.Up ? "-selected" : ""}">Vote Up</span>

ただし、ここには2つの問題があります。

  1. vote-up@{puzzle.UserVote .... @記号をコードブロックの開始として扱いません
  2. @puzzle.UserVote == VoteType.Up@puzzle.UserVote変数の値をレンダリングすることになっているように最初の部分を調べます。

誰もがこれらの問題に対処する方法を知っていますか?


6
私はRazorを使用していませんが、私が見ているものに基づいて、試してください@(puzzle.UserVote == VoteType.Up ? "-selected" : "")
Lasse Espeholt

これはかみそりのインライン三項演算子のトップ結果であるため、出力にhtmlまたはアポストロフィなどのエンコード可能な文字が含まれている場合(たとえば@(isSomething ? "class='test'" : "")、JavaScriptの挿入など)、それらをエンティティとしてエンコードし&#39;、ページを分割することを追加します。したがって、を使用する必要がありますHtml.Raw("..")。そうでなければ、上記のコード<p class=&#39;test&#39;>では、無効なものになってしまいます。
NibblyPig

回答:


298

これはうまくいくはずです:

<span class="vote-up@(puzzle.UserVote == VoteType.Up ? "-selected" : "")">Vote Up</span>

2
ブレースではなく括弧を使用するのは非常に奇妙です
pat capozzi

32

重要なのは、@デリミタの後の括弧で式をカプセル化することです。このようにして、任意の複合式を機能させることができます。


28
@( condition ? "true" : "false" )

1
私は、このいずれかのために行ってきましたきれいな感じ、後で戻って読みやすいです
ダン・ハリス

1
ToString()を呼び出すのではなく、プロパティ(文字列を含む)の値を表示する必要がある場合-これは、私の場合は機能しませんでした。これは@(condition?$ "{foo.bar}": "Default")で実行できます
Dan Harris

6

ほとんどの場合CD のソリューションは完全に問題なく動作します。しかし、私はもう少しねじれた状況にありました:

 @(String.IsNullOrEmpty(Model.MaidenName) ? "&nbsp;" : Model.MaidenName)

これにより、「&nbsp;」と表示されます 私のページで、それぞれソースを生成します&amp;nbsp;。これで、Html.Raw("&nbsp;")ソースコードを記述できるはずの関数がありますが、この配置ではコンパイラエラーがスローされます。

コンパイラエラーメッセージ:CS0173: 'System.Web.IHtmlString'と 'string'の間に暗黙的な変換がないため、条件式のタイプを特定できません

だから私は次のようなステートメントを書くことになりました。

@if (String.IsNullOrEmpty(Model.MaidenName)) { @Html.Raw("&nbsp;") } else { @Model.MaidenName } 

注:興味深いのは、中かっこの中に入ると、Razorブロックを再起動する必要があることです。


なぜだけではないのか@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Model.MaidenName)
JP Hellemons '26 / 09/26

ええと。前述のコンパイラエラーのためどうですか?;)
Damian Vogel

3
申し訳ありませんが、もっとコーヒーが必要です:)
JP Hellemons 2018年

1
三項演算子の両側を同じ型にすることで、このエラーを回避できます@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Html.Raw(Model.MaidenName))
NibblyPig
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.