0

Lets say I have a partial view that contains both a checkbox and a numerical value. I have a ViewModel that contains a Model -- Terms -- that implements the partial view. When I submit it, the modifications made in the Terms Partial View does not reflect to the Terms property of ViewModel. I'm probably misunderstanding a concept or another on how it works, anyone care to point it out please?

View

@model ViewModel
@using (Html.BeginForm("ViewAction", "ViewController", FormMethod.Post))
{
 // Other ViewModel Property Editors

 @Html.Partial("Terms", Model.Terms)
 <input type="submit" value="Submit" />
}

Partial View

@model Terms

@Html.CheckBoxFor(m => m.IsAccepted)
@Html.EditorFor(m => m.NumericalValue)

Controller

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult ViewAction(int id)
{
 ViewModel vm = GetVmValues();
 return View(vm);
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult ViewAction(ViewModel vm)
{
 // Access ViewModel properties
}
4

2 に答える 2

1

デフォルトのモデル バインダーは、Terms モデルのコントロール ID の名前がTerms.IsAcceptedand であることを想定していますTerms.NumericalValue。モデルのエディター テンプレートを作成してから、パーシャルを使用する代わりにTerms呼び出す必要があります。@Html.EditorFor(m=> m.Terms)

エディタ テンプレートの詳細については、こちらをご覧ください。MVC 2 からのものですが、それでも関連するはずです。

于 2012-04-17T03:25:18.187 に答える
0

部分ビューのモデルタイプを「用語」ではなく「ViewModel」に変更します。更新されたコードは次のとおりです。

意見:

@model ViewModel
@using (Html.BeginForm("ViewAction", "ViewController", FormMethod.Post))
{
 // Other ViewModel Property Editors

 @Html.Partial("Terms", Model)  //Set parent 'ViewModel' as model of the partial view
 <input type="submit" value="Submit" />
}

部分図:

@model ViewModel

@Html.CheckBoxFor(m => m.Terms.IsAccepted)
@Html.EditorFor(m => m.Terms.NumericalValue)

生成されるHTMLは次のようになります。

<input id="Terms_IsAccepted" name="Terms.IsAccepted" type="checkbox" value="true">

DefaultModelBinderは、値プロバイダー(フォームデータ/ルートデータ/ query-stirng / httpファイルなど)から複雑なオブジェクトに値をマップしますが、オブジェクトのプロパティとして名前を持つ値を検索します。あなたの場合、「ViewModel」の「Terms」子オブジェクトを構築するために、「Terms.IsAccepted」、「Terms.NumericalValue」などの名前の値を検索します。Htmlヘルパーはプロパティパス式を使用して生成しますhtml要素の名前。これが、部分ビューのモデルとして親ViewModelを使用する必要がある理由です。

お役に立てれば...

于 2012-04-17T04:56:03.433 に答える