对具有相同属性名称

时间:2015-12-04 15:26:23

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

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

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

2 个答案:

答案 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()也会正确匹配

附注:您也可以使用部分来解决此问题,方法是将前缀作为ViewDatathis answer传递,但正确的方法是使用EditorTemplate