4

私は、ASP.NET に関する Steven Sanderson の本を読んでいて、本当に混乱するところまで来ました。

作品

@foreach (var link in Model)
{
    @Html.RouteLink(link, new { controller = "Product", action = "List", category = link, page = 1 });
}

動作しません

@foreach (var link in Model)
{
    Html.RouteLink(link, new { controller = "Product", action = "List", category = link, page = 1 });
}

(違いはブロック内の最初の文字です)

どちらのシナリオでも、Razor はそれがマークアップ (HTML) ではなくコードであることを認識し@ます。違いは何ですか?何が欠けていますか?

編集:

うまくいかないことを明確にする必要があります。メニューでlinkあり、現在のカテゴリです。これで@正常に動作し、カテゴリへのリンクが表示されますが、それがないと、カテゴリがないかのように..何も表示されません。

4

4 に答える 4

2

パーサーの内部foreachでは、コード モードまたは剃刀テンプレート モードの場合は自動的に機能し、html、剃刀、またはコードを出力できます。

2 つのステートメントの違いは、1 つは Razor テンプレート モード (動作中) であり、もう 1 つはコード モード (動作していない) であることです。

Html.RouteLinkを返しMvcHtmlStringます。2 番目の例 (コード モード) では、関数を実行し、MvcHtmlString返されたもので何もしないため、ページを要求しても何もレンダリングされません。

最初の作業例では、それはかみそりテンプレート モードであり、@Html.RouteLinkそれを行うと、かみそりテンプレートに追加され、かみそりはそれを正しく解釈し、リンクをレンダリングします。

于 2013-01-24T15:52:16.643 に答える
2

セミコロンを使用する場合 ; (または @ なし) コード行を実行していますが、戻り値は応答ストリームに書き込まれませんが、それなしで @ を使用すると、その時点で結果 (MvcHtmlString) が直接応答ストリームに返されます。

于 2013-01-24T15:49:37.990 に答える
2

この@場合の は、ステートメントの結果をユーザーに出力することを示します。に似ていResponse.Write()ます。

符号を省略した場合@、関数は結果を返しますが、どこにも代入または送信されないため、失われます。

于 2013-01-24T15:53:17.547 に答える
0

覚えておくべきことは、その foreach ブロック内にも html を含めることができるということです。

作品:

@if (someConditionalExpression)
{
    <p>Only shown if the conditional was true.</p>
}

ここではマークアップも有効であるため、@シンボルを使用して、マークアップではなくコードが再度必要であることをビュー エンジンに示す必要があります。そうでなければ、あなたが望んでいたものがあいまいです。

于 2013-01-24T15:50:24.753 に答える