gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:20:30 25 4
gpt4 key购买 nike

是否可以通过 Http-POST 将对象从强类型 View 发送到 Controller ,该对象与原始模型的类型不相同。

例如:

我有一个像这样的 ViewModel:

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

PersonsViewModel() { }
}

public class PersonViewModel
{
//some properties

Person() { }
}

现在我有了这个 View :

@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>

Controller Action

[ValidateAntiForgeryToken]
[HttpPost]
public ActionResult Postaction(PersonViewModel model)
{
//do something
}
}

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

尽管 View 是强类型的,但是否有可能仅将一个 PersonViewModel 传递给 Controller ​​?

亲切的问候,马丁

最佳答案

可以做到:

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

假设您有 _PersonViewModel.cshtml 局部 View

@for(int i = 0; i > Model.persons.Count; i++)
{
Html.RenderPartial("_PersonViewModel", Model.persons[i]);
}

在 _PersonViewModel.cshtml 中,您不能同时使用 Html.EditorForHtml.TextboxFor 等编辑器助手,因为它们将为相同的属性,因此您必须手动创建 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 对象发送到 Controller 操作

关于c# - ASP Net MVC - 在 POST 上发送不同的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36445353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com