重命名 HTML 名称属性以将数据导入模型

本文关键字:数据 导入 模型 属性 HTML 重命名 | 更新日期: 2023-09-27 18:36:58

我在使用 post 将数据从表单传递到我的模型中时遇到问题。

我有以下代码:

public ActionResult Edit(int? id)
{
    ...
    return this.View("Edit", Tuple.Create(staff, team);
}

如您所见,我将元组返回到视图,因为我需要有多个模型。我想我通常会创建一个视图模型,但在这种情况下,我认为这将很多。将元组、列表甚至字典返回到视图通常是否有问题?我应该始终创建一个视图模型吗?

这是视图:

@model Tuple<Staff, List<Team>>
@{
    var staff = Model.Item1;
    var teams = Model.Item2;
}
@using(Html.BeginForm())
{
    ...
    @Html.LabelFor(model => staff.Foo)
    @Html.EditorFor(model => staff.Bar)
}
@using(Html.BeginForm())
{
    ...
    @Html.LabelFor(model => team.Foo)
    @Html.EditorFor(model => team.Bar)
}

无论如何,这段代码呈现如下:

<input type="text" ... name="staff.Foo" ... />

<input type="text" ... name="team.Foo" ... />

这是我的目标控制器(当我提交表格"员工"时):

[HttpPost]
public ActionResult Edit([Bind(Include = "foo,bar")] Staff staff)
{
   ...
   this.DbContext.SaveChanges();
   ...
}

问题是,数据将通过邮寄发送,但我的模型一直为空。我想这是因为我将我的模型作为元组传递给视图。即使我改变了

@Html.EditorFor(model => model.Item1.Foo)

将是

<input type="text" ... name="Item1.Foo" ... />

我该如何解决这个问题。我找不到将 name 属性重命名为"Foo"而不是"员工"的解决方案。傅"。我想这会解决问题。我真的必须创建一个视图模型吗?

此致敬意

重命名 HTML 名称属性以将数据导入模型

如果您只发布模型/元组的一个复杂属性,则可以使用 Bind.Prefix 属性

[HttpPost]
public ActionResult Edit([Bind(Prefix="staff")] Staff model)

这有效地从属性中删除了staff.前缀,因此staff.Foo变得Foo并将绑定到类 Staff ,但是我强烈建议使用视图模型而不是Tuple(无论如何它实际上代码更少)。