C#学习教程:NameFor在编辑器模板中迭代集合时生成错误的名字0;im[i].Foo)@Html.EditorFor(m=>m[i].Bar)}Foo和Bar只是字符串属性。这将为[i].Foo和[i].Barforms生成HTML名称属性,这些属性当然是正确的并且在表单中发布时正确绑定。现在假设上面的视图是一个编辑器模板,它是这样呈现的(其中Model.Items是一个列表):@modelWrappingViewModel@Html.EditorFor(m=>m.Items)示例-Items.[i].Foo。默认模型联编程序无法绑定它,因为它需要Items[i].Foo形式。这在第一种情况下工作正常——视图不是编辑器模板——并且在集合是属性而不是整个模型的情况下也工作正常:@Html.EditorFor(m=>m.Items[i].Foo)只有当模型本身是一个集合并且视图是一个编辑器模板时它才会失败。有几种方法可以解决这个问题,但没有一种是理想的:所以,问题是:为什么NameFor(以及EditorFor)在这种特殊情况下表现出这种行为,当它适用于轻微的变化(即它是有意的,并且如果是这样,为什么)?有没有一种简单的方法可以解决此问题而没有上述任何缺点?根据要求,完整代码重现:放;}publicWrappingViewModel(){Items=newList();}}publicclassItemViewModel{publicstringFoo{get;放;}publicstringBar{get;放;}}控制器动作:publicActionResultIndex(){varmodel=newWrappingViewModel();model.Items.Add(newItemViewModel{Foo="Foo1",Bar="Bar1"});model.Items.Add(newItemViewModel{Foo="Foo2",Bar="Bar2"});返回视图(模型);}Index.cshtml:@modelWrappingViewModel@using(Html.BeginForm()){@Html.EditorFor(m=>m.Items)}_ItemView.cshtml(编辑器模板):@modelList@for(inti=0;im[i].Foo)@Html.EditorFor(m=>m[i].Bar)}Foo和Bar输入的名称属性将采用Model.[i].Property的形式,并且在发布时不会绑定到带有签名ActionResultIndex(WrappingViewModel)返回的操作方法。请注意,如果您在主视图中迭代Items,或者如果您摆脱WrappingViewModel,如上所述,将顶层模型设为List并直接迭代模型可以正常工作。它仅适用于这种特定情况。为什么NameFor(以及EditorFor)在这种特殊情况下表现出这种行为,当它适用于轻微的变化时(即它是有意的,如果是,为什么)?这是一个错误(链接),它将随着ASP.NETMVC5的发布而得到修复。是否有一种简单的方法来修复此行为而没有上述任何缺点?简单:使用以下代码添加ItemViewModel.cshtml编辑器模板:@modelItemViewModel@Html.EditorFor(m=>m.Foo)@Html.EditorFor(m=>m.Bar)删除_ItemView.cshtml编辑器模板。从[UIHint("_ItemView")]中移除[UIHint("_ItemView")]属性。有点难:添加ItemViewModel.cshtml编辑器模板(与上面相同)。修改_ItemView.cshtml:@modelList@{stringoldPrefix=ViewData.TemplateInfo.HtmlFieldPrefix;尝试{ViewData.TemplateInfo.HtmlFieldPrefix=string.Empty;for(inti=0;iitem,null,itemPrefix)}}最后{ViewData.TemplateInfo.HtmlFieldPrefix=oldPrefix;更新如果你不想为第二个选项添加ItemViewModel.cshtml编辑器模板,而不是@Html.EditorFor(m=>item,null,itemPrefix)你必须写这样的东西:@Html.EditorFor(m=>item.Foo,null,Html.NameFor(m=>item.Foo).ToString().Replace("item",itemPrefix))@Html.EditorFor(m=>item.Bar,null,Html.NameFor(m=>item.Bar).ToString().Replace("item",itemPrefix))注意:最好把这段代码包装成扩展方法以上是C#学习教程:在编辑器模板中迭代的时候collection中,NameFor会生成错误的名字。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
