【问题标题】:Unobtrusive validation on multiple models with same property names对具有相同属性名称的多个模型进行不显眼的验证
【发布时间】:2015-12-04 15:26:23
【问题描述】:

我有一个包含多个局部视图的视图绑定到不同的模型。

@model MyApp.ViewModels.ParentViewModel

@Html.Partial("_PartialView1", Model.PartialView1)
@Html.Partial("_PartialView2", Model.PartialView2)

不显眼的验证有效,问题是视图的模型具有相同名称的属性。

public class ClassA
{
   public int SomeProperty { get; set; }
}

public class ClassB
{
   public int SomeProperty { get; set; }
}

public class ParentViewModel
{
   public int ClassA PartialView1  { get; set; }
   public int ClassB PartialView2  { get; set; }
}

由于两个属性名称相同,因此它们的 html 名称属性也相同。

如果 ClassA.SomeProperty 有错误,ClassB.SomeProperty 中也会显示相同的错误。 有没有办法在不更改属性名称的情况下进行正确的验证?

【问题讨论】:

    标签: asp.net-mvc unobtrusive-validation asp.net-mvc-partialview


    【解决方案1】:

    不要使用partials(这会导致没有正确前缀的重复名称属性,并且在您提交表单时无法绑定到您的模型)。

    正确的方法是使用EditorTemplate。将 _PartialView1.cshtml 重命名为 ClassA.cshtml 并将其移动到 /Views/Shared/EditorTemplates 文件夹(_PartialView2 同上,需要重命名为 ClassB.cshtml - 即匹配类的名称)。然后在主视图中

    @model MyApp.ViewModels.ParentViewModel
    ....
    @Html.EditorFor(m => m.PartialView1)
    @Html.EditorFor(m => m.PartialView2)
    

    您的 html 现在将生成正确的名称属性

    <input name="PartialView1.SomeProperty" .... />
    <input name="PartialView2.SomeProperty" .... />
    

    关联的@Html.ValidationMessageFor() 也会正确匹配

    旁注:您也可以通过将前缀作为附加的ViewData 传递给this answer 来解决此问题,但正确的方法是使用EditorTemplate

    【讨论】:

    • 不错!谢谢!我马上试试这个。一个问题,与前缀方式相比,使用编辑器模板有显着优势吗?
    • EditorFor() 方法就是为此而设计的,这意味着您不必将魔术字符串(前缀)传递给部分(这使您的代码更难维护 - 如果您以后更改了怎么办物业名称?)。 EditorFor() 方法也接受 IEnumerable&lt;T&gt; 所以如果你有一个属性说 List&lt;ClassA&gt; myProperty 然后 EditorFor(m =&gt; m.myProperty) 将生成正确的 html 包括绑定到模型所需的索引器。
    【解决方案2】:

    除非它们以不同的形式存在,否则我认为不给它们起不同的名称是不可能的。

    【讨论】:

      猜你喜欢
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多