我在MVC2应用程序中有一个实例,其中两个 View 之间的唯一区别是对同一字段的范围验证检查略有不同。为了使应用程序尽可能保持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和逻辑来填充它。
最佳答案
这似乎是一个已知问题:
https://connect.microsoft.com/VisualStudio/feedback/details/483001/in-asp-net-mvc-generic-try-updatemodel-methods-ignore-subtype-properties
感谢您报告此问题。这是具有ASP.NET MVC模型绑定(bind)功能的故意设计决策。要覆盖使用的类型,可以在调用UpdateModel和TryUpdateModel时指定一个显式类型:
UpdateModel(模型);
当您忽略类型时,编译器将使用其类型推断逻辑来猜测您想要的类型。在这种情况下,它将做出不正确的猜测。
(不进行自我测试)我建议尝试在绑定(bind)期间将类型强制转换为子类型,看看是否会迫使它识别属性。
关于asp.net-mvc - 在派生的ViewModel上覆盖ValidationAttributes,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7961983/