かみそりで(特にHTML属性で)三項演算子を使用するにはどうすればよいですか?


401

WebFormsビューエンジンでは、特にHTML属性内で、非常に単純な条件に3項演算子を一般的に使用します。例えば:

<a class="<%=User.Identity.IsAuthenticated ? "auth" : "anon" %>">My link here</a>

上記のコードは、ユーザーの認証の有無に応じて<a>authまたはそれにanon応じてタグをタグに付与します。

Razorビューエンジンと同等の構文は何ですか?Razorでは、コードとマークアップにいつ出入りするかを「知る」ためにHTMLタグが必要であるため、現在、次の問題に悩まされています。

@if(User.Identity.IsAuthenticated)  { <a class="auth">My link here</a> }
else { <a class="anon">My link here</a> }

これは、控えめに言ってもひどいです。

私はこのようなことをしたいのですが、Razorでどのように理解するのに苦労しています:

<a class="@=User.Identity.IsAuthenticated ? "auth" : "anon";">My link here</a>

-

更新:

それまでの間、このHtmlHelperを作成しました:

public static MvcHtmlString Conditional(this HtmlHelper html, Boolean condition, String ifTrue, String ifFalse)
{
  return MvcHtmlString.Create(condition ? ifTrue : ifFalse);
}

これはRazorから次のように呼び出すことができます。

<a class="@Html.Conditional(User.Identity.IsAuthenticated, "auth", "anon")">My link here</a>

それでも、拡張メソッドでラップせずに三項演算子を使用する方法があることを願っています。


「ベストプラクティス」の問題と同様に、ヘルパーなどIHtmlStringのメソッドnew HtmlString("Some stuff here");を使用して型を返す必要があると思います...
Justin Soliz



回答:


767

@()式の構文を使用できるはずです。

<a class="@(User.Identity.IsAuthenticated ? "auth" : "anon")">My link here</a>

私はRazorをインストールしていませんが、間違っている可能性があります。


60
Razor構文の便利なリファレンスを以下に示します。C#Razor構文クイックリファレンス
Ryan Lundy

<a class=@(User.Identity.IsAuthenticated?"auth":"anon")>ここに私のリンク</a>
BiLaL

&&演算子をこのロジックに追加できますか?
alerya 2017

58

補遺:

重要な概念は、Razorコードの式を評価することです。これを行うための最良の方法(たとえば、foreachループにいる場合)は、ジェネリックメソッドを使用することです。

Razorでジェネリックメソッドを呼び出す構文は次のとおりです。

@(expression)

この場合、式は次のとおりです。

User.Identity.IsAuthenticated ? "auth" : "anon"

したがって、解決策は次のとおりです。

@(User.Identity.IsAuthenticated ? "auth" : "anon")

このコードは、html属性だけでなく、Razorの任意の場所で使用できます。

C#Razor Syntax Quick Reference(Phil Haackのブログ)については、@ Kyralessaのコメントを参照してください。


主な回答に同様のコメントを追加した後、あなたの補遺に気づきました。
BiLaL

22

より簡単なバージョンで、目が楽です!

@(true?"yes":"no")

11
それは簡単ではありません。それは同じ答えで、値は異なります
Dave Rael

4
-1デイブラエルは正解です。これは、値が異なる同じコードです
ジャック

6
これは実際に三項演算子を説明しています。したがって、条件の真と偽がどこであるかを示さないソリューションへの良い中毒です。
Maurizio、デンマーク:

3
私はそうだと思いました。開発者として、私たちは明確な答えを持つことが許可されています。
モンスターX

17

VBかみそりでASP.netを使用する場合は、3項演算子も使用できます。

それは、かみそりの表現の中にある必要があります:

@(Razor_Expression)

三項演算子は次のように機能します。

If(BooleanTestExpression, "TruePart", "FalsePart")

VBかみそりを使用してここで示した同じコード例は、次のようになります。

<a class="@(If(User.Identity.IsAuthenticated, "auth", "anon"))">My link here</a>

注:TextExpressionを作成する場合、ブール記号はC#とVBで同じではないことに注意してください。


1

私の問題では<a>text</a>、ビュー内のアンカーのテキストが何らかの値に基づいていることを望んでおり、そのテキストはフォームから取得されますApp string Resources

これ@()が解決策です

<a href='#'>
      @(Model.ID == 0 ? Resource_en.Back : Resource_en.Department_View_DescartChanges)
</a>

テキストがこれからApp string Resources使用されていない場合

@(Model.ID == 0 ? "Back" :"Descart Changes")

0

この方法を使用することもできます。

<input type="text" class="@(@mvccondition ? "true-class" : "false-class")">

これを試してください..幸運をありがとう。


@をmvc条件で追加する必要はありますか?@は最初から使われているので、そうは思いません。
Mubashar Shahzad

@()の下で@を使用する必要はありません
Aikansh Mann
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.