ASP Net MVC - 在POST上发送不同的模型

Mar*_*tin 2 c# asp.net asp.net-mvc asp.net-mvc-5

是否可以通过Http-POST将强类型视图中的对象发送到Controller,该Http-POST不等于原始模型的类型.

例如:

我有一个像这样的ViewModel:

public class PersonsViewModel
{
    List<PersonViewModel> persons { get; set; }

    PersonsViewModel() { }
}

public class PersonViewModel
{
    //some properties

    Person() { }
}
Run Code Online (Sandbox Code Playgroud)

现在我有了这个观点:

@model PersonsViewModel

<div>
  @for(int i = 0; i > Model.persons.Count; i++)
{
    @Html.EditorFor(Model.persons[i])
}
</div>
Run Code Online (Sandbox Code Playgroud)

编辑器看起来像这样:

@model PersonViewModel

<div>
     @using (Html.Beginform("Postaction","Controller", FormMethod.Post)){
     <div>
       <!-- properties and textboxes here + submit button -->
     </div>
}
<div>
Run Code Online (Sandbox Code Playgroud)

控制器动作

[ValidateAntiForgeryToken]
        [HttpPost]
        public ActionResult Postaction(PersonViewModel model)
        {
            //do something
        }
    }
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为看起来Controller似乎期待一个PersonsViewModel对象.到目前为止,我的解决方法是创建一个包含所有PersonViewModel的"大"表单,并将完整的PersonsViewModel发送到控制器.

虽然视图是强类型的,但它是否有可能只将一个PersonViewModel传递给Controller?

亲切的问候,马丁

Ale*_*rt. 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]);
}
Run Code Online (Sandbox Code Playgroud)

在_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>
Run Code Online (Sandbox Code Playgroud)

这样,您可以将单个PersonViewModel对象发布到控制器操作