我在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/

10-11 23:05
查看更多