我有一个包含数组的复杂模型。为了渲染这个数组的项目,我正在使用EditorFor:
for (int i = 0; i < Model.Contacts.Phones.Length; i++)
{
@Html.EditorFor(x => x.Contacts.Phones[i])
}
内部编辑器有一个后期表格。问题是,只有当我完全指定绑定前缀时,绑定才会成功:
[HttpPost]
public ActionResult SavePhone(
[Bind(Prefix = "Contacts.Phones[0]")]Contact5UsedPhone model)
{ ... }
因此它仅适用于第一个元素。什么是正确的前缀形式?
对于不同属性的同一页面编辑器也有更多 - 但是因此执行相同类型的模型和相同的操作。是否可以设置多个绑定前缀? E.g。
[HttpPost]
public ActionResult SavePhone(
[Bind(Prefix = "Contacts.Phones[0], Contacts.AnotherPrefix")]
Contact5UsedPhone model)
{ ... }
谢谢!
编辑 - 模型:
public class ContactsViewModel
{
public Contact5UsedPhone AddiblePhone {get;set;}
public Contact5UsedPhone[] Phones {get;set;}
...
}
编辑 - 回答: 我找到了解决方案。由于有一个数组(电话)和一个单一实体(AddiblePhone),我使用了两个参数,简单如果:
[HttpPost]
public ActionResult SavePhone(
[Bind(Prefix = "Contacts.Phones")]Contact5UsedPhone[] models,
[Bind(Prefix = "Contacts.AddiblePhone")]Contact5UsedPhone model)
{
model = model ?? models[0];
...
}
问题仍然存在 - 如果将AddiblePhones作为数组怎么办?是否可以为一个参数使用两个前缀,还是必须将它分成两个参数,就像我在这种情况下所做的那样?
答案 0 :(得分:1)
我们找到了明确而简单的答案:
@Html.EditorFor(x => x.Phones[i],
"~/Views/Contacts/EditorTemplates/Contact5UsedPhone.cshtml",
"")
最后一个“”表示它不会使用任何前缀进行绑定。这很好,所以你不需要任何绑定前缀和两种可接受的模式,如问题中的答案所示。
还有一个小问题 - 如果将AddiblePhones作为数组怎么办?是否可以为一个参数使用两个前缀,或者是否必须按照我在回答中提出的方式进行划分?但是,如果需要这样的东西,这可能表明设计不好......
EDIT(Telerik控件): 使用Telerik下拉列表时会出现这个很好的解决方案的问题,因为它不会为元素生成唯一的ID,并且这些控件是jQuery控制的,因此它无法正常工作。
警告: 我发现,当使用Bind属性时,你不能在属性和参数类型之间使用“”(空格)。
工作的:
[Bind(Prefix = "Phones")]Contact5UsedPhone[]
不起作用:
[Bind(Prefix = "Phones")] Contact5UsedPhone[]
我不知道这是否只是数组的情况。但它似乎对我不利。
答案 1 :(得分:1)