[必需]是什么作用?

4
我在网上找不到[必需](Required)的具体含义。msdn文章并没有详细说明。
static class Program
{
    public static Main()
    {
        var vustomer = new CustomerClass();
    }
}

public class CustomerClass
{
    public string m_FirstName;
    [Required]
    public string m_LastName;
}

据我所了解,由于m_LastName是必需但未设置的,因此应该会抛出异常。但是我却没有收到异常。我不明白这有什么好处,也不知道这实际上是做什么用的。

1
在ASP.NET MVC 4中,它被用于在基于该类并具有该字段的表单中使字段成为必填项。 - Jeroen Vannevel
它本身什么也不做。一些库会检查它,在Web应用程序中的模型绑定器可能是最重要的。 - CodesInChaos
你可以在 msdn 上查找这些内容。 - Matt Burland
3
实际上,我觉得MSDN的文章非常清晰易懂... 你有看过这篇文章吗?http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute(v=vs.110).aspx - dee-see
那么,它只能在ASP.NET应用程序中使用吗? - user2762996
1
@user2762996:不,它被设计成供任何想使用它的人使用。 - Jon
5个回答

7
RequiredAttribute,像其他属性一样,并没有实际作用,只是用来标注某个类型的字段。检测到该属性的存在并做出相应反应完全取决于消费该类型的应用程序。
您的示例程序没有这样做,因此该属性没有任何可见效果。某些框架,如ASP.NET MVC和WPF,则会检查并响应该属性的存在。

3

1

RequiredAttribute的文档:

指定数据字段值为必需。

然而,此验证通常仅在UI层执行。它并未“嵌入”构造函数或其他低级别用法中。如果要手动触发验证,可以执行以下操作:

var customer = new CustomerClass();
var context = new ValidationContext(customer, serviceProvider: null, items: null);
var results = new List<ValidationResult>();

var isValid = Validator.TryValidateObject(customer, context, results);

if (!isValid)
{
    foreach (var validationResult in results)
    {
        Console.WriteLine(validationResult.ErrorMessage);
    }
}

1
在C#中,属性几乎是类和属性的装饰。除了一些与安全相关的属性外,大多数属性都没有实际作用。它们被高级框架用于某些操作。在ASP.NET 4 MVC的情况下,只有当对象是请求的一部分时,才使用该属性生成错误。如果您想在任何其他环境中使用该属性,则必须编写代码来检查它。它不会从一个简单的public static void Main()中执行任何操作。

1

除了目前的回答,这是我能想到的一些实际用途:

  • Entity Framework使用此方法将数据库建模为非空字段。
  • Javascript客户端验证提供了检查输入字段是否有任何数据的javascript库,否则防止表单提交以避免不必要的往返服务器。
  • 在执行模型绑定时,服务器端验证还会检查是否在请求中传递了带有该装饰器的属性。这确定了模型状态是否应设置为无效状态。(1)
  • 还有针对JSON.NET库的注释,可以更改模型的序列化/反序列化方式。我相当自信(但不确定)Json.net的验证模式确实考虑了“Required”属性。
  • 其他属性装饰器用于Web服务,但“Required”不是我知道在这种情况下有用途的一个。
  • Web API使用此属性在文档帮助页面和模型绑定上标记属性为必需。
  • 您可以创建自己的应用程序逻辑,可以了解“Required”属性。例如,在视图上为标签中的属性加上*,如果它是必需的。
这只是一些用途,但不局限于此。
(1)注意:如果您的属性例如为int,并使用Required进行装饰,则模型状态永远不会处于无效状态。您应该对此使用可空属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接