在EditorTemplate(在数组上)/多个绑定前缀内的表单发布期间绑定模型?

时间:2011-06-29 09:09:44

标签: c# arrays model-view-controller binding editortemplates

我有一个包含数组的复杂模型。为了渲染这个数组的项目,我正在使用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作为数组怎么办?是否可以为一个参数使用两个前缀,还是必须将它分成两个参数,就像我在这种情况下所做的那样?

2 个答案:

答案 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)