我有一个包含多个部分视图绑定到不同模型的视图。
@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中会显示相同的错误。 有没有办法在不更改属性名称的情况下进行适当的验证?
答案 0 :(得分:0)
除非他们采用不同的形式,否则我认为如果不给他们一个不同的名字是可能的。
答案 1 :(得分:0)
不要使用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