0

假设我有一个包含复选框和数值的局部视图。我有一个 ViewModel,它包含一个实现局部视图的模型——术语。当我提交它时,在条款部分视图中所做的修改不会反映到 ViewModel 的条款属性中。我可能误解了一个或另一个关于它是如何工作的概念,有人愿意指出吗?

看法

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

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

局部视图

@model Terms

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

控制器

[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

默认模型绑定器希望您的条款模型的控件 ID 被命名为Terms.IsAcceptedTerms.NumericalValue. 您需要为您的Terms模型创建一个编辑器模板,然后调用@Html.EditorFor(m=> m.Terms)而不是使用部分。

您可以在此处阅读有关编辑器模板的更多信息。它来自 MVC 2,但仍然应该是相关的。

于 2012-04-17T03:25:18.187 回答
0

将 Partial View 的模型类型更改为“ViewModel”而不是“Terms”。这是更新的代码:

看法:

@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 回答