0

以下は、MVC3/Razor ビュー ファイルからのコード スニペットを簡略化したものです。

@foreach (var item in Model.Stuff.Items){
<tr>
  <td>@item.Title</td>
</tr>
<tr>
  <td>
    @using (Html.BeginForm()) {
        @item.Title
        @Html.HiddenFor(item => item.Title)
    }
  </td>
</tr>
}  @* End of Items foreach loop *@

タイトルは最初の行に表示されます。フォーム内にも表示されます。HiddenForしかし、エラーCS0136でそれを使用しようとすると、「アイテム」という名前のローカル変数は、「親または現在/子」ですでに使用されている「アイテム」に別の意味を与えるため、このスコープで宣言できません。他の何かを示すスコープ

なぜそうなるのかわかりません。最初のitem => item.Title「アイテム」の は、事実上、無名関数の単なるパラメーター名ですよね?

それを次のように変更すると:@Html.HiddenFor(s => s.Title)エラー CS1963 が発生します。式ツリーには動的操作が含まれていない可能性があります。

背景: 意図は、Model.Stuff.Items のエントリごとに 2 つのテーブル行を持つことです。最初の行は現在の情報を静的 HTML として提供し、2 つ目はその編集フォームを提供します。(javascript を使用すると、いつでもどちらか一方が非表示になります。) フォームは、このコントローラーの別のアクションに送信されます。すべてのフォームが同じ URL に送信されます。非表示の値は、どの行が更新されているかを識別します。

4

3 に答える 3

3

なぜそうなるのかわかりません。in item => item.Title 最初の「item」は事実上、無名関数の単なるパラメーター名ですよね?

はい。ただし、同じ名前の別の変数を、その名前のローカル変数が既に含まれているスコープに導入しています。あなたはそれをすることはできません。ラムダ式内で使用すると、あいまいになりますitem。パラメーターを意味する場合もあれば、反復変数を意味する場合もあります。

これは MVC や Razor とは関係がないことに注意してください。次のコードでも同じエラーが発生します。

int x = 0;
Func<int, int> y = x => x;

C# 5 仕様のセクション 17.15.1 から:

無名関数のパラメータのスコープは、anonymous-function-body です。(§3.7) パラメータ リスト (指定されている場合) と共に、無名メソッド本体は宣言空間を構成します (§3.3)。したがって、無名関数のパラメーターの名前が、スコープに anonymous-method-expression または lambda-expression を含むローカル変数、ローカル定数、またはパラメーターの名前と一致すると、コンパイル時エラーになります。

于 2012-10-09T05:49:25.103 に答える
2

使用する@Html.HiddenFor(x => item.Title)

@foreach (var item in Model.Stuff.Items){
<tr>
  <td>@item.Title</td>
</tr>
<tr>
  <td>
    @using (Html.BeginForm()) {
        @item.Title
        @Html.HiddenFor(x => item.Title)
    }
  </td>
</tr>
}
于 2012-10-09T05:53:23.620 に答える
1

問題のCS1963部分の場合、この部分ビューファイルの先頭に@Modelを設定し、それをHTML.Partial()の2番目のパラメーターとして渡すことで解決されます。

したがって、私の外側のビューでは、Html.Partial行は次のように変更されました。

 @Html.Partial("partial.example",Model.Stuff.Items)

次に、partial.examples.cshtmlの先頭に、次のように追加しました。

@model IEnumberable<Type.Of.Items>

そして、foreach行は次のように変更されました。

@foreach (var item in Model){

最後に、Yasserが提案したように、CS0136エラーを取り除くために:

@Html.HiddenFor(x => item.Title)

item => item.Title(そして、なぜ許可されなかったのかを説明してくれたJonに感謝します。)

于 2012-10-09T09:24:59.690 に答える