是否可以通过Http-POST将强类型视图中的对象发送到Controller,该Http-POST不等于原始模型的类型。
例如:
我有一个像这样的ViewModel:
public class PersonsViewModel
{
List<PersonViewModel> persons { get; set; }
PersonsViewModel() { }
}
public class PersonViewModel
{
//some properties
Person() { }
}
现在我有了这个观点:
@model PersonsViewModel
<div>
@for(int i = 0; i > Model.persons.Count; i++)
{
@Html.EditorFor(Model.persons[i])
}
</div>
编辑器可能如下所示:
@model PersonViewModel
<div>
@using (Html.Beginform("Postaction","Controller", FormMethod.Post)){
<div>
<!-- properties and textboxes here + submit button -->
</div>
}
<div>
控制器动作
[ValidateAntiForgeryToken]
[HttpPost]
public ActionResult Postaction(PersonViewModel model)
{
//do something
}
}
这不起作用,因为看起来Controller似乎需要一个PersonsViewModel对象。到目前为止,我的解决方法是创建一个包含所有PersonViewModel的“大”表单,并将完整的PersonsViewModel发送到控制器。
虽然视图是强类型的,但在某种程度上是否可以将一个PersonViewModel传递给Controller?
亲切的问候, 马丁
答案 0 :(得分:6)
可以做到:
当与集合Html.EditorFor
一起使用时,它足够聪明,可以生成包含索引的输入名称,因此ModelBinder
可以成功地将模型创建为对象集合。在您的情况下,因为您希望每个PersonViewModel
对象都有一个单独的表单,您可以创建一个部分视图作为编辑PersonViewModel
的模板并使用Html.RenderPartial
帮助程序:
假设您有_PersonViewModel.cshtml
部分视图
@for(int i = 0; i > Model.persons.Count; i++)
{
Html.RenderPartial("_PersonViewModel", Model.persons[i]);
}
在_PersonViewModel.cshtml中,您不能同时使用Html.EditorFor
,Html.TextboxFor
之类的编辑助手,因为它们将为相同的属性生成相同的ID,因此您必须手动创建html输入:
@model PersonViewModel
<div>
@using (Html.Beginform("Postaction","Controller", FormMethod.Post)){
<div>
@*Nottice the usage of Html.NameFor(m=>m.FirstName) for generating a name property value *@
<input type="text" name="@Html.NameFor(m=>m.FirstName)" value="@Model.FirstName">
</div>
}
<div>
这样您就可以将单个PersonViewModel
对象发布到控制器操作