假设我有一个包含复选框和数值的局部视图。 我有一个ViewModel,它包含一个模型 - 术语 - 实现局部视图。当我提交时,条款部分视图中所做的修改不会反映在ViewModel的Terms属性中。我可能误解了一个或另一个关于它是如何工作的概念,有人想指出它吗?
查看
@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
}
答案 0 :(得分:1)
默认型号装订器需要将您的条款模型的控件ID命名为Terms.IsAccepted
和Terms.NumericalValue
。您需要为Terms
模型创建一个编辑器模板,然后调用@Html.EditorFor(m=> m.Terms)
而不是使用部分模型。
您可以阅读有关编辑器模板here的更多信息。它来自MVC 2,但仍然应该是相关的。
答案 1 :(得分: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作为局部视图的模型。
希望这会有所帮助......