Asp.net mvc 覆盖派生ViewModel上的ValidationAttribute

Asp.net mvc 覆盖派生ViewModel上的ValidationAttribute,asp.net-mvc,asp.net-mvc-2,Asp.net Mvc,Asp.net Mvc 2,我在一个MVC2应用程序中有一个实例,其中两个视图之间的唯一区别是对同一字段的范围验证检查略有不同。为了使应用程序尽可能保持干燥,我想知道是否有可能以某种方式覆盖validation属性 我尝试使用派生的ViewModel来覆盖该属性,并以不同的方式实现范围检查,如下所示: public class Base { [Range(1, 100)] public virtual int SomeProperty { get; set; } } public class Derive

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

我尝试使用派生的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,并且永远不会继承,但这感觉太错误了。我将复制视图、视图模型和逻辑来填充它。

这似乎是一个已知的问题:

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


(在不测试自己的情况下)我建议在绑定过程中尝试在子类型中键入cast,看看这是否会迫使它识别该属性。

客户端验证无法识别该属性,因此这可能发生在绑定发生之前。我也有同样的问题,我认为我们被迫复制视图和模型是愚蠢的。你最后做了什么?我完全同意。尽管如此,我想我最终还是这样做了;复制ViewModels。