6

親ページのビューモデルと同じ名前のプロパティがモデルに含まれている、強く型付けされた部分ビューがあります。何らかの理由で、レンダリングエンジンは、期待値ではなく、親ビューモデルの値をレンダリングしています(少なくとも私が期待する値です!)

親ページビューモデルの抽出:

public class ParentPageViewModel
{
    public int Id { get; set; } // problem property
    ...
    public IEnumerable<ChildViewModel> Children { get; set; }
}

子ページビューモデルの抽出:

public class ChildViewModel
{
    public int Id { get; set; } // problem property
    ...
}

親ページの抽出(Razor):

@model ParentPageViewModel
...
@foreach (var item in Model.Children)
{
    @Html.Partial("MyPartialView", item)
}
...

部分ビュー抽出:

@model ChildViewModel
...
<form ...>
    @Html.HiddenFor(m => m.Id) // problem here - get ParentPageViewModel.ID not ChildViewModel.Id
</form>
...

したがって、基本的にレンダリングされた出力では、非表示フィールドには、部分ビューに渡される値ではなく、親ビューモデル要素の値が含まれます。@ChildViewModel.Id@の名前を@ChildViewModel.ChildId@のような名前に変更すると期待どおりに機能するため、これは間違いなく名前が原因です。興味深いことに、デバッガーでビューモデルの値を調べると、正しい値が表示されます。間違っているのはレンダリングされた出力だけです。

これを回避する方法、または私がやろうとしていることを行う「正しい」方法はありますか(ajax検証/テーブル行への更新の投稿のためにテーブルにミニフォームをレンダリングしています)

ありがとう、

ティム

4

4 に答える 4

14

これにあなたの呼び出しを変更することは問題を解決すると思います:

@Html.Partial("MyPartialView", item, new ViewDataDictionary())

子ビューはViewDataディクショナリから値を取得しているため、これにより新しいディクショナリが子ビュー(hattip danludwig)に渡されます。

于 2012-08-07T11:23:24.217 に答える
2

解決策を見つけました。手動で非表示フィールドを作成します。例:

<input type="hidden" name="Id" value="@Model.Id" />

Html.HiddenForを使用する代わりに。

(他の解決策がある場合、または誰かが問題を説明できる場合に備えて、しばらくの間、これを回答済みとしてマークしません)

于 2012-08-07T11:18:32.357 に答える
2

私はこれが古い投稿であることを知っています。でも、同じ問題に直面してここに着陸したので、貢献したほうがいいと思いました。私の問題は少し異なっていました。私の場合、ページ/ビュー全体を更新する必要がある部分的なビューアクションがトリガーされた後、メインビューのIDが正しくありませんでした。ModelState.Clearで問題を解決しました

ModelState.Clear();
return View("Maintenance", model);  //call main view from partial view action
于 2016-06-26T08:08:40.677 に答える
0

Views / Shared/EditorTemplatesにChildViewModel.cshtmlという名前のファイルを作成します。部分ビューをそのファイルに入れます。

〜/ Views / Shared / EditorTemplates / ChildViewModel.cshtml

@model ChildViewModel
...
<form ...>
    @Html.HiddenFor(m => m.Id)
</form>
...

次に、次のようにレンダリングします。

@model ParentPageViewModel
...
@foreach (var item in Model.Children)
{
    @Html.EditorFor(m => item)
}
...

または、ビューをエディターテンプレートとしてではなく部分的に保持したい場合は、Simonの回答を使用してください。

于 2012-08-07T11:18:09.817 に答える