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类型的属性重载等)。

RangeAttribute not working

难怪它不工作,因为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