2

私は本当に奇妙な問題を抱えています。だから、私の構造はこのようなものです

<div id="tasks">
   @Html.Partial("_Tasks", tasks)
</div>

_Tasks では、すべてのタスクに対して foreach を実行し、タスクごとに追加の部分を持っています

...
@Html.Partial("_Time", new TimeViewModel(task))
...

そして_Timeの中にフォームがあります

...
@Html.TextBoxFor(m => m.Name)
....

したがって、ビューでパーシャルをレンダリングしてから、複数のパーシャルの内部でフォームをレンダリングします。ページの読み込みを実行すると、機能します。問題は、私が ajax を使用しているときから始まるので、Time を編集してサーバーに投稿し、返された html で #tasks を更新します。

私は私が持っているコントローラーアクションです...

...
return View("_Tasks", tasks);

問題は、 @Html.TextBoxFor(m => m.Name) によって生成されたすべての入力が同じ値を持つことです。なんで?私が行った場合

@Html.DisplayFor(m => m.Name)

私は元気に働いています。私も試してみました

@Html.TextBoxFor(m => m.Name, new { Value = Model.Name })

それは機能しますが、私にはハックに見えます。

問題は、なぜこの動作を得るのですか? すべての TextBoxFor の値が同じなのはなぜですか?

4

1 に答える 1

1

ASP.NET MVC の既定のモデル バインダーは、入力タグの名前属性を使用して値をモデルにマップする方法を決定します。すべての html ヘルパーは、それを念頭に置いてマークアップを生成します。

だからあなたが書くとき

@Html.TextBoxFor(m => m.Name)

次のようなものが生成されます。

<input type="text" name="Name" />

ただし、このヘルパーを部分ビューで使用し、メイン モデルのプロパティであるモデルをバインドしようとすると、機能しません。パーシャルの Html ヘルパーは、そのモデルがメイン モデルであると考えてマークアップを生成します。したがって、入力はメイン モデルの Name プロパティにバインドされます。この問題を解決するには、この質問をご覧ください。また、投稿リクエストを処理するときに、デフォルトのバインダーは複雑なコレクションを取得できないことに注意してください。

于 2012-11-10T22:48:46.363 に答える