RangeAttribute not working
本文关键字:working not RangeAttribute | 更新日期: 2023-09-27 18:23:49
(我接受VB.NET或C#解决方案没有任何问题)
我创建了一个新的空WinForms项目,其中的内容是用VB.NET编写的,只是为了测试RangeAttribute,但范围和错误消息被完全忽略(任何错误):
Public Class Form1
Private Shadows Sub Load() Handles MyBase.Load
Dim Test As New Test With {.MyInt32 = Integer.MaxValue}
MessageBox.Show(Test.MyInt32) ' Result: 2147483647
End Sub
End Class
Public Class Test
<System.ComponentModel.DataAnnotations.Range(1I, 10I, errormessage:="something")>
Public Property MyInt32 As Integer
Get
Return Me._MyInt32
End Get
Set(ByVal value As Integer)
Me._MyInt32 = value
End Set
End Property
Private _MyInt32 As Integer = 0I
End Class
为什么会发生这种情况?
在寻找替代解决方案时,我使用PostSharp创建了一个方面,如本问题的一个答案中所述,但我不喜欢这个解决方案,因为我不应该依赖第三方库来做这件事,以防.NET Framework类库公开了一种做同样事情的方法(我认为这要好得多,因为DateTime类型的属性重载等)。
难怪它不工作,因为WinForms
不支持RangeAttribute
。命名空间System.ComponentModel.DataAnnotations中的所有内容都适用于web应用程序。
"System.ComponentModel.DataAnnotations命名空间提供用于定义ASP.NET MVC和ASP.NET数据控件元数据的属性类。"-MSDN
您只需要执行验证。虽然System.ComponentModel.DataAnnotations
通常用于Web,但这并不意味着它们只能在那里工作。代码项目上提供了一个很好的控制台演示。
以下是您的代码的快速修改版本:
Imports System.ComponentModel.DataAnnotations
Public Class Form1
Private Shadows Sub Load() Handles MyBase.Load
Dim Test As New Test
Test.MyInt32 = Int32.MaxValue
MessageBox.Show(Test.MyInt32) ' Result: 1, because it got set to this in the exception handler of the property setter
End Sub
End Class
Public Class Test
<Range(1, 10, errormessage:="something")>
Public Property MyInt32 As Integer
Get
Return Me._MyInt32
End Get
Set(ByVal value As Integer)
Try
Validator.ValidateProperty(value, New ValidationContext(Me, Nothing, Nothing) With {.MemberName = "MyInt32"})
Me._MyInt32 = value
Catch ex As ValidationException
Me._MyInt32 = 1
End Try
End Set
End Property
Private _MyInt32 As Integer
End Class