【问题标题】:ASP.NET MVC - model validation of type int and DateTimeASP.NET MVC - 类型 int 和 DateTime 的模型验证
【发布时间】:2012-01-19 10:21:25
【问题描述】:

让我们有一个模型

     public class Model 
     {
         public int Number { get; set; }
         public DateTime Date { get; set; } 
     }

我观察到以下行为。 Number 属性的值为 0,Date 的值为 1.1 0001 00:00:00,此时未提交任何内容且 ModelState.IsValid 的值为 true。

DataAnnotationsModelValidatorProvider 类和 GetValidators 方法有这段代码

        // Add an implied [Required] attribute for any non-nullable value type,
        // unless they've configured us not to do that. 
        if (AddImplicitRequiredAttributeForValueTypes &&
                metadata.IsRequired && 
                !attributes.Any(a => a is RequiredAttribute)) { 
            attributes = attributes.Concat(new[] { new RequiredAttribute() });
        } 

如果我理解这一点,那么 Number 属性和 DateTime 属性应该设置为 RequiredAttribute 并且验证例程应该将模型设置为无效并生成适当的 错误消息。

所以我的问题是为什么模型无效?

我正在使用 ASP.NET MVC 3

【问题讨论】:

    标签: asp.net-mvc validation


    【解决方案1】:

    所以我的问题是为什么模型无效?

    因为0 是一个完全有效的整数,而1.1 0001 00:00:00 是一个完全有效的日期时间。我不明白你为什么认为你的模型无效。

    使 em 可以为 null 并用Required 属性装饰以达到预期的效果:

    public class Model 
    {
         [Required]
         public int? Number { get; set; }
    
         [Required]
         public DateTime? Date { get; set; } 
    }
    

    【讨论】:

    • 模型应该是无效的,因为没有从表单发送值。这些值不是来自输入。所以要求的规则被打破了。在我看来,为所需值使用可为空的类型似乎是错误的。首先,一个不可为空的 int 应该表现得像没有任何必需属性的情况下是必需的。并且可为空的 int 应该表现得像一个非必需值
    • @user49126,您不能将 no value 存储在不可为空的类型中,例如 intDateTime。无论您多么努力,CLR 都不会允许您这样做。它的工作方式是默认模型绑定器实例化模型(当然,它的所有属性都分配给它们的默认值,在您的情况下,值类型将是它们各自的默认值),然后调用验证。由于这 2 个属性在其中具有完全有效的值,因此没有验证错误并且非常有意义。
    • 我知道,但至少模型应该是无效的。
    • @user49126,你为什么这么认为?这没有意义。模型包含其属性的有效值,因此模型完全有效。
    • 但是表单没有提供这个值。这是一个 C# 实现问题。恕我直言,它应该像 FluentValidation 库中的 NotEmpty 验证器一样工作。 fluentvalidation.codeplex.com/…
    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2011-12-24
    • 1970-01-01
    • 2011-09-29
    相关资源
    最近更新 更多