【问题标题】:Wrong rendered name of child view model property子视图模型属性的错误渲染名称
【发布时间】:2012-07-19 17:33:59
【问题描述】:

我有以下视图模型:

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 MVC rer Children[0].Quantity 名称?

【问题讨论】:

    标签: .net asp.net-mvc razor


    【解决方案1】:

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

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

    如果您确实需要一些特殊处理,您可以将IList&lt;ChildViewModel&gt; 包装到另一个类中,并在该类的 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])
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      相关资源
      最近更新 更多