C# ASP Net MVC-在邮件上发送不同的模型

C# ASP Net MVC-在邮件上发送不同的模型,c#,asp.net,asp.net-mvc,asp.net-mvc-5,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 5,是否可以通过Http POST从强类型视图向控制器发送与原始模型类型不相同的对象 例如: 我有这样一个ViewModel: public class PersonsViewModel { List<PersonViewModel> persons { get; set; } PersonsViewModel() { } } public class PersonViewModel { //some properties Person() { }

是否可以通过Http POST从强类型视图向控制器发送与原始模型类型不相同的对象

例如:

我有这样一个ViewModel:

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

    PersonsViewModel() { }
}

public class PersonViewModel
{
    //some properties

    Person() { }
}
@model PersonViewModel

<div>
     @using (Html.Beginform("Postaction","Controller", FormMethod.Post)){
     <div>
       <!-- properties and textboxes here + submit button -->
     </div>
}
<div>
这不起作用,因为控制器似乎需要PersonViewModel对象。到目前为止,我的解决方法是制作一个包含所有PersonViewModel的“大”表单,并将完整的PersonViewModel发送给控制器

尽管视图是强类型的,但是否有可能只将一个PersonViewModel传递给控制器

亲切问候,, 马丁可以这样做:

当与集合
Html一起使用时,EditorFor
足够智能,可以生成包含索引的输入名称,因此
ModelBinder
可以成功地将模型创建为对象集合。在您的情况下,因为您希望每个
PersonViewModel
对象有一个单独的表单,所以可以创建一个局部视图作为编辑
PersonViewModel
的模板,并使用
Html.RenderPartial
帮助程序:

假设您有
\u 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>
@model PersonViewModel
@使用(Html.Beginform(“Postaction”、“Controller”、FormMethod.Post)){
@*注意使用Html.NameFor(m=>m.FirstName)生成name属性值*@
}

通过这种方式,您可以将单个
PersonViewModel
对象发布到控制器操作中

对于第一个问题,简短的回答是否(在MVC中默认情况下)。ModelBinder将您传递的字段的名称与您在操作中声明的类型相匹配。您应该看看自定义模型绑定器:通常,您会将PersonViewModel的ID发送到控制器,然后控制器会在那里查询数据源以检索数据对象。谢谢,这正是我要查找的
[ValidateAntiForgeryToken]
        [HttpPost]
        public ActionResult Postaction(PersonViewModel model)
        {
            //do something
        }
    }
@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>