在派生的ViewModel上覆盖ValidationAttributes

时间:2011-11-01 02:52:36

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

我在MVC2应用程序中有一个实例,其中两个视图之间的唯一区别是对同一字段的范围验证检查略有不同。为了尽可能地将应用程序保持为DRY,我想知道是否有可能以某种方式覆盖验证属性。

我试图让一个派生的ViewModel覆盖属性并以不同的方式实现范围检查:

public class Base
{
    [Range(1, 100)]
    public virtual int SomeProperty { get; set; }
}

public class Derived : Base
{
    [Range(2, 100)]
    public override int SomeProperty { get; set; }
}

然而,当我尝试MVC客户端验证似乎仍然继续获取基类的验证属性而不是派生的属性。

我知道有一种思路认为我应该有一个完全不同的ViewModel并且永远不会继承,但它只是感觉错了。我将复制View,ViewModel和逻辑来填充它。

1 个答案:

答案 0 :(得分:1)

这似乎是一个已知问题: https://connect.microsoft.com/VisualStudio/feedback/details/483001/in-asp-net-mvc-generic-try-updatemodel-methods-ignore-subtype-properties

  

感谢您报告此问题。这是一个深思熟虑的设计决策,具有ASP.NET MVC的模型绑定功能。要覆盖使用的类型,可以在调用UpdateModel和TryUpdateModel时指定显式类型:       的UpdateModel(模型);   当您省略类型时,编译器将使用其类型推断逻辑来猜测您的类型。在这种情况下,它会猜测是不正确的。

(不测试自己)我建议尝试在绑定期间键入强制转换为子类型,看看是否会强制它识别属性。