【问题标题】:ASP Net MVC - Send different model on POSTASP Net MVC - 在 POST 上发送不同的模型
【发布时间】:2016-04-06 08:19:52
【问题描述】:

是否可以通过 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
        }
    }

这不起作用,因为控制器似乎需要一个 PersonsViewModel 对象。到目前为止,我的解决方法是制作一个包含所有 PersonViewModel 的“大”表单并将完整的 PersonsViewModel 发送到控制器。

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

亲切的问候, 马丁

【问题讨论】:

  • 对于第一个问题,简短的回答是 NO(默认情况下在 MVC 中)。 ModelBinder 将您传递的字段名称与您在操作中声明的类型进行匹配。你应该看看自定义模型绑定器:codeproject.com/Articles/605595/ASP-NET-MVC-Custom-Model-Binder
  • 一般情况下,您会将 PersonViewModel 的 ID 发送到 Controller,然后它会在其中查询数据源以检索数据对象。

标签: c# asp.net asp.net-mvc asp.net-mvc-5


【解决方案1】:

可以做到:

当与集合一起使用时,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.EditorForHtml.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 对象发布到控制器操作

【讨论】:

  • 谢谢,这正是我想要的
猜你喜欢
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
相关资源
最近更新 更多