子视图模型属性的呈现名称错误

时间:2012-07-19 17:33:59

标签: .net asp.net-mvc razor

我有以下视图模型:

public class ViewModel
{
   //...
   [UIHint("Children")
   public IList<ChildViewModdel> Children {get;set;}
}

其中ChildViewModel类具有Quantity属性(long类型)。

这是儿童编辑模板:

@model  IList<ChildViewModel>
@for (var index = 0; index < Model.Count(); index++)
{
    @Html.EditorFor(x => x[index])
}

现在我按@Html.EditorForModel()渲染模型,结果是第一个ChildViewModel的Quanity文本框名称为Children.[0].Quantity。你在[0]之前看到这个额外的点吗?结果模型绑定器无法识别这些值,并且在用户发布表单时不会正确处理它们。如何使ASP.NET MVC rener Children[0].Quantity名称?

1 个答案:

答案 0 :(得分:2)

首先让我说这是一种正确的行为(至少“按设计”)。当MVC潜入嵌套属性时,它会附加“PropertyName”。 (在末尾提到点)在嵌套模型内的每个字段前面。所以你得到“孩子们”。来自ViewModel,“[0]。”来自IList<ChildViewModel>的{​​{1}}和“数量”。

这里的主要问题是为什么需要ChildViewModel的特殊模板? MVC有自己的特殊情况来处理IEnumerables,所以通常你不应该干涉。

如果您确实需要一些特殊处理,可以将IList<ChildViewModel>包装到另一个类中,并在该类的EditorTemplate中引入您的特殊逻辑。它就像是:

IList<ChildViewModel>

在这里,它是ChildViewModdels EditorTemplate

中的特殊逻辑
public class ViewModel
{
   public ChildViewModdels Children {get;set;}
}
public class ChildViewModdels 
{
   public IList<ChildViewModdel> Children {get;set;}
}

同样,如果您确实需要那个特殊逻辑(这个问题不确定),那就是这种情况。