对具有相同 属性 名称的多个模型进行不显眼的验证
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
我有一个包含绑定到不同模型的多个局部视图的视图。
@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