MVC2 DataAnnotations继承验证

时间:2010-03-22 17:25:05

标签: asp.net asp.net-mvc-2 data-annotations

我有一个.NET 2.0类,其属性标记为virtual.I需要将该类用作MVC2应用程序中的模型。因此,我创建了一个继承自.NET 2.0类的.NET 3.5类,并将DataAnnotations属性添加到新类的overriden属性中。我所做的一小部分是在

之下
// .NET 2.0 class
public class Customer
{
   private string _firstName = "";
   public virtual string FirstName
   {
      get { return _firstName; }
      set { _firstName = value; }
   }
}

// .NET 3.5 class
public class MVCCustomer : Customer
{
   [Required(ErrorMessage="Firstname is required")]
   public override string FirstName
   {
      get { return base.FirstName; }
      set { base.FirstName = value; }
   }
}

我使用HtmlFor帮助程序将该类用作MVC2视图的模型。 Serverside验证工作正常,但客户端验证不正常。具体而言,页面上不显示验证错误。

我错过了什么,或者只能使用好友类来做到这一点。

感谢。

编辑1: 我现在用伙伴验证类尝试了这个,但这也不起作用。

编辑2: 我现在已经知道提供给HtmlFor助手的lambda表达式导致了问题。例如,

Html.TextBoxFor(M => m.FirstName)。调用它计算MemberExpression(expression.Body)作为客户类的DeclaringType而不是MVCCustomer类ModelMetadata.FromLambdaExpression方法

我试图改变λ表达式来Html.TextBoxFor((MVCCustomer米)=> m.FirstName)。但是DeclaringType还是客户

有没有办法可以让DeclaringType成为MVCCustomer类型,而不是Customer。

2 个答案:

答案 0 :(得分:2)

我现在已经通过在.net 3.5类中的属性上使用new关键字来解决这个问题,如下所示

// .NET 2.0 class
public class Customer { 
  private string _firstName = "";
  public string FirstName
  {
     get { return _firstName; }
     set { _firstName = value; }
  }
}

// .NET 3.5 class
public class MVCCustomer : Customer {
   [Required(ErrorMessage="Firstname is required")]
   public new string FirstName 
   { 
      get { return base.FirstName; } 
      set { base.FirstName = value; }
   }
}

现在按预期工作,并且正确应用了MVCCustimer类的DataAnnotations属性。

希望这有帮助

答案 1 :(得分:0)

愚蠢的问题,但您是否在视图/主文件中包含以下脚本?

<script src="../../Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="../../Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>
<script src="../../Scripts/MicrosoftMvcValidation.js" type="text/javascript"></script>

这些是客户端验证所必需的。