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項演算子を使用する方法があることを願っています。
@()
式の構文を使うことができるはずです。
<a class="@(User.Identity.IsAuthenticated ? "auth" : "anon")">My link here</a>
私はRazorをインストールしていないので、間違っている可能性があります。
重要な概念は、Razorコード内の式を評価しているということです。これを行うための最善の方法(たとえば、foreachループ内にいる場合)は、汎用メソッドを使用することです。
Razorで一般的なメソッドを呼び出すための構文は次のとおりです。
@(expression)
この場合、式は次のようになります。
User.Identity.IsAuthenticated ? "auth" : "anon"
したがって、解決策は次のとおりです。
@(User.Identity.IsAuthenticated ? "auth" : "anon")
このコードは、html属性だけでなく、Razorのどこでも使用できます。
C#Razor Syntax Quick Reference(Phil Haackのブログ)についての@Kyralessaのコメントを参照してください。
簡単な目、簡単な目のために!
@(true?"yes":"no")
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の間で同じではないことを覚えておいてください。
私の問題では、ビュー内のアンカー<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")
この方法を使うこともできます。
<input type="text" class="@(@mvccondition ? "true-class" : "false-class")">
これを試してください。幸運をありがとう。