web-dev-qa-db-ja.com

かみそりで三項演算子を使用する方法(特にHTML属性)は?

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

<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> }

これは、穏やかに言えば、ひどいです。

私は何かをしたいのですがlikeしかし、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>

それでも、拡張メソッドで折り返すことなく、3項演算子を使用する方法があることを願っています。

369
Portman

@()式の構文を使うことができるはずです。

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

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

709
David Brown

補遺:

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

Razorで一般的なメソッドを呼び出すための構文は次のとおりです。

@(expression)

この場合、式は次のようになります。

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

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

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

このコードは、html属性だけでなく、Razorのどこでも使用できます。

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

50
awrigley

簡単な目、簡単な目のために!

@(true?"yes":"no")
18
Monsters X

VB razorを指定してASP.netを使用する人のために、三項演算子も可能です。

かみそりの式の中にも含まれている必要があります。

@(Razor_Expression)

三項演算子は次のように動作します。

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

ここに示したVB razorと同じコード例は、次のようになります。

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

注意:TextExpressionを書くとき、ブールシンボルはC#とVBの間で同じではないことを覚えておいてください。

16
George_DLJ

私の問題では、ビュー内のアンカー<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")">

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

0
Arjun