1

我有以下视图模型:

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 的 Quantity 文本框名称是Children.[0].Quantity. 你在 [0] 之前看到这个额外的点了吗?结果模型绑定器无法识别这些值,并且在用户发布表单时无法正确处理它们。如何制作 ASP.NET MVCChildren[0].Quantity名称?

4

1 回答 1

2

首先让我声明这是一种正确的行为(至少“按设计”)。当 MVC 深入到嵌套属性时,它会附加“PropertyName”。(提到最后的点)在该嵌套模型内的每个字段前面。所以你得到了“孩子”。从ViewModel, "[0]." 来自IList<ChildViewModel>和来自 的“数量” ChildViewModel

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

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

public class ViewModel
{
   public ChildViewModdels Children {get;set;}
}
public class ChildViewModdels 
{
   public IList<ChildViewModdel> Children {get;set;}
}

这里是您在 ChildViewModdels EditorTemplate 中的特殊逻辑

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

同样,如果您确实需要这种特殊逻辑(从问题中不确定) ,则适用于这种情况

于 2012-07-19T17:54:41.777 回答