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

C# 在EditorTemplate内表单发布期间绑定模型(在数组上)/多个绑定前缀?,c#,arrays,model-view-controller,binding,editortemplates,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]) } 所以它只对第一个元素有效。前缀的正确形式是什么 对于更多内容,同一页面上还有针对不同属性的编辑器,但因此会执行相同类型的模型和相同的操作。是否可以设置多个绑定前缀?例如 [H

我有一个包含数组的复杂模型。对于此数组的渲染项,我使用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], 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];
    ...
}

问题仍然存在——如果有可添加的电话作为阵列呢?是否可以对一个参数使用两个前缀,还是像我在本例中所做的那样必须将其划分为两个参数?

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

@Html.EditorFor(x => x.Phones[i], 
    "~/Views/Contacts/EditorTemplates/Contact5UsedPhone.cshtml", 
    "")
最后一个“”表示不使用任何前缀进行绑定。这很好,所以您不需要任何绑定前缀和两种可接受的模式,如问题的答案所示

还有一个小问题-如果有可添加的电话作为阵列会怎么样?一个参数可以使用两个前缀,还是像我在问题的答案中所建议的那样必须进行分割?但如果需要这样的东西,这可能意味着糟糕的设计

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

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

作品:

[Bind(Prefix = "Phones")]Contact5UsedPhone[]
不起作用:

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

我不知道这是否是数组的唯一情况。但对我来说似乎很难。

很高兴你找到了一个明确的解决方案。也许你会喜欢更清晰的。看看



您可以发布viewmodel的代码吗。你应该在你的动作上有一个IEnumerable参数,或者在你的viewmodel上有一个属性。经过编辑和部分回答…我没有时间深入研究它,但似乎你必须编写很多代码才能使它工作。我不知道它是否能够处理需要Telerik控件的唯一id(我以前的编辑),但如果不能,您可能可以自己实现它-再次编码。我认为最好的解决方案是创建自定义IModelBinder并使用它,以便它忽略不相关的前缀,但仍然保留自动生成的ID,以便Teleriks可以工作。还没有测试。@Jozef不确定我跟踪了你。如果您找到解决方案,请与他人分享though@JozefKrchňavý:检查VS解决方案,它有3种编辑集合/数组的方法。我想这是第一个适用于你的案例。
[Bind(Prefix = "Phones")] Contact5UsedPhone[]