【问题标题】:How do Data Annotations work?数据注释如何工作?
【发布时间】:2011-09-23 17:06:43
【问题描述】:

我在我的 ASP.NET MVC 3 项目中使用数据注释来验证模型。这些非常方便,但目前它们对我来说很神奇。我读到数据注释确实 not 抛出异常。那么 MVC 是如何知道将验证错误添加到模型状态字典的呢?如果没有抛出异常,由于模型验证而无法在模型上设置属性如何冒泡到 MVC?我一直认为每次属性失败时都会引发异常,并且 MVC 模型绑定会捕获异常并将其添加到模型状态字典中。

为了测试这一点,我创建了一个控制台应用程序并添加了一个带有验证注释的示例类:

public class MyObject
{
    [StringLength(10, MinimumLength=3)]
    public string Name { get; set; }
}

然后我实例化了该对象并尝试将小于 3 的值分配给 Name 属性。尽管注释说不允许小于 3 的字符串长度,但该属性分配得很好。

    static void Main(string[] args)
    {
        MyObject mine = new MyObject();
        mine.Name = "hi";
        Console.WriteLine(mine.Name);
        Console.ReadLine();
    }

这个小程序向控制台写出“hi”。为什么?当试图将mine.Name 设置为“hi”时,我预计它会生气。

我错过了什么?

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    你永远不会调用任何东西来验证属性。验证本身不会神奇地发生。来自http://msdn.microsoft.com/en-us/library/dd901590%28v=vs.95%29.aspx

    手动验证值

    当您不使用 DataGrid 时 控件提供接口 编辑数据,验证 属性不会自动 应用。但是,您可以手动 使用验证测​​试 Validator 班级。您可以致电 ValidateProperty 方法集上 一个属性的访问者来检查 验证值 属性的属性。你必须 同时设置ValidatesOnExceptionsNotifyOnValidationError 属性 数据绑定接收时为真 验证中的验证异常 属性。以手动为例 应用验证,请参阅数据 绑定示例如下。

    【讨论】:

    • 如果我这样做 mine.Name. 我看不到一个名为 ValidateProperty 的方法。
    • 它不在 mine.name 上。那可能应该是“从属性的 set 访问器的 inside 调用 Validate.ValidateProperty 方法...`
    【解决方案2】:

    那么 MVC 是如何知道添加的 模型状态的验证错误 字典?

    ModelValidatorProvider,更具体地说,DataAnnotationsModelValidatorProvider。这是由 MVC 调用的。

    【讨论】:

    • 后端还是前端?我猜它会自动创建 REST API 或验证或类似的东西,因为我在前端看不到类似的东西。
    【解决方案3】:

    C# 提供了一种定义声明性标签的机制,称为 属性,您可以将其放置在源中的某些实体上 指定附加信息的代码。该信息 包含的属性可以在运行时通过反射检索。

    https://msdn.microsoft.com/en-us/library/aa288059(v=vs.71).aspx

    以下三篇文章可帮助您扩展对属性工作原理的了解。如果您了解如何使用它们,最后一个是最不重要的。这篇文章是针对silverlight的,但仍然适用于手头的主题。

    Introduction to Attributes

    Attributes

    DataTypeAttributes

    Using Data Annotations w/ silverlight

    【讨论】:

      【解决方案4】:

      因为您没有检查模型是否有效...数据符号检查模型的有效性。那么你会得到你的错误。

      【讨论】:

      • 我不检查模型是否有效的唯一原因是因为它是 2017 年,我现在什至不记得这段代码了 XD
      猜你喜欢
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多