对具有相同 属性 名称的多个模型进行不显眼的验证

Unobtrusive validation on multiple models with same property names

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

@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也会出现同样的错误。 有没有办法在不更改 属性 名称的情况下进行适当的验证?

除非它们是不同的形式,否则我认为不给它们一个不同的名字是不可能的。

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

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

@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 传递,但正确的方法是使用 EditorTemplate