c# - 为什么 ASP.Net MVC 范围属性采用类型?

标签 c# asp.net-mvc asp.net-mvc-3 data-annotations

我只是想知道为什么Range验证属性可以接受一个Type和两个字符串作为参数?这是为了根据枚举或类似的东西验证字符串吗?

此外,我想做的是找到一种简单的方法来验证枚举中必须存在的 3 个字符的字符串,有什么建议吗?

谢谢, 亚历克斯。

最佳答案

我确实发现你提到的 Range ctor 可疑。忍不住一探究竟。 (所以我在调查的时候把这个答案写成了日志。)

来自 MSDN

public RangeAttribute(
    Type type,
    string minimum,
    string maximum
)

注意:MSDN 说 Type 应该是 IComparable。而且,他们的示例描述说它用于日期比较,但实际上不是!

因此,由于我打开了我的生产 asp.net mvc3 应用程序,所以我在日期时间如下所示尝试了此操作:

[Range(typeof(DateTime),"1-Jan-1910","1-Jan-2060")]

当我运行它时,会发生这种情况:

enter image description here

请注意,尽管我用虚线指定了最小值和最大值并且没有时间,但它给出了不同的格式,所以它可能 TryParsing 字符串对吗?但我敢肯定它不可能 ICompare 客户端的两者!?现在无论我输入什么日期仍然显示错误。 (日期输入为 11-Mar-20(2020 年为 20)。)

我尝试了 char(如下),因为那也是一个 IComparable。一样。它实际上无法在客户端进行范围比较。

[Range(typeof(char), "a", "g")]

但是等等...

只需删除客户端验证!我删除了对 JQuery 验证和 Unobtrusive 验证和中提琴的引用!它工作完美。当值(字符和日期)不在指定范围内时,它会发布,然后正确显示错误

注意:也许有人可以扩展此解决方案以仅禁用某些字段进行客户端验证。

希望这对您有所帮助。

关于c# - 为什么 ASP.Net MVC 范围属性采用类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5366549/

相关文章:

c# - Nlog Target Database 在运行时设置连接信息

asp.net-mvc - MVC 4 : Create controller for Shared view _Layout. cshtml

asp.net-mvc - 在 MVC4 中使用资源进行本地化

c# - 使用 ASP.Net MVC 3 和区域绘制图表

c# - 为什么是 RestSharp AddHeader ("Accept", "application/json"); = 到项目列表?

C# lambda - 两个列表内内部列表的差异(除外)

c# - 初始化列表时遇到问题

.net - 获取 msbuild 以远程部署干净的应用程序

c# - 如何获得浏览量最高的前5名产品?

c# - 数据过滤是否发生在 Controller 、服务或存储库层?