0

我有一个包含数组的复杂模型。为了渲染这个数组的项目,我使用 EditorFor 像这样:

for (int i = 0; i < Model.Contacts.Phones.Length; i++)
{       
    @Html.EditorFor(x => x.Contacts.Phones[i])
}

在编辑器里面有一个post-form。问题是,只有当我准确指定绑定前缀时,绑定才会成功:

[HttpPost]
public ActionResult SavePhone(
    [Bind(Prefix = "Contacts.Phones[0]")]Contact5UsedPhone model)
{ ... }

所以它只适用于第一个元素。前缀的正确形式是什么?

更重要的是,在同一页面编辑器上也有不同属性的 - 但因此执行相同类型的模型和相同的操作。是否可以设置多个绑定前缀?例如

[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;}
    ...
}

编辑 - 答案:我找到了解决方案。由于有一个数组(Phones)和一个单一实体(AddiblePhone),我使用了两个参数,如果:

[HttpPost]
public ActionResult SavePhone(
    [Bind(Prefix = "Contacts.Phones")]Contact5UsedPhone[] models, 
    [Bind(Prefix = "Contacts.AddiblePhone")]Contact5UsedPhone model)
{
    model = model ?? models[0];
    ...
}

问题仍然存在——如果有 AddiblePhones 作为数组呢?是否可以为一个参数使用两个前缀,还是必须像我在这种情况下那样将其分为两个参数?

4

2 回答 2

1

我们为此找到了明确而简单的答案:

@Html.EditorFor(x => x.Phones[i], 
    "~/Views/Contacts/EditorTemplates/Contact5UsedPhone.cshtml", 
    "")

最后一个“”表示它不会使用任何前缀进行绑定。太好了,因此您不需要任何绑定前缀和两种接受的模式,如问题的答案所示。

还有一个小问题——如果有 AddiblePhones 作为数组呢?是否可以为一个参数使用两个前缀,还是必须按照我在问题答案中提出的那样进行划分?但是,如果需要这样的东西,这可能表明设计不好......

编辑(Telerik 控件):使用 Telerik 下拉列表时会出现这个很好的解决方案的问题,因为它为元素生成不唯一的 id,并且这些控件是 jQuery 控制的,因此它不能正常工作。

警告:我发现,当使用 Bind 属性时,您不能在属性和参数类型之间使用“”(空格)。

作品:

[Bind(Prefix = "Phones")]Contact5UsedPhone[]

不起作用:

[Bind(Prefix = "Phones")] Contact5UsedPhone[]

我不知道这是否只是数组的情况。但这对我来说似乎很奇怪。

于 2011-06-30T10:50:48.560 回答