[必需]做什么?

时间:2014-01-28 15:29:12

标签: c#

我在网上什么都没发现[必需]实际上是什么。 msdn-article根本没有探索性。

static class Program
{
    public static Main()
    {
        var vustomer = new CustomerClass();
    }
}

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

据我所知,这应该抛出异常,因为m_LastName是必需的,但没有设置。但我没有得到一个。我不知道它有什么好处以及它实际上做了什么。

6 个答案:

答案 0 :(得分:7)

像所有其他属性一样,

RequiredAttribute除了注释某些东西(在这种情况下,是一个类型的字段)之外什么都不做。完全取决于使用该类型来检测属性的存在并相应地做出响应的应用程序。

您的示例程序不执行此操作,因此该属性没有任何可见效果。某些框架(如ASP.NET MVC和WPF 执行检查并响应属性的存在。

答案 1 :(得分:3)

Validator类使用此属性根据从ValidationAttribute继承的任何类型添加验证错误。例如,MVC model validation使用它。

答案 2 :(得分: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);
    }
}

答案 3 :(得分:1)

要添加到当前答案中,这些一些我可以想到的实际用途:

  • 实体框架使用它来将数据库建模为不可空的字段。
  • Javascript客户端验证提供了javascript库,用于检查输入字段是否包含任何数据,否则会阻止表单提交,以避免不必要的往返服务器。
  • 服务器端验证(进行模型绑定时)还会检查何时使用该装饰器发布模型,传入的属性位于请求中。这确定是否应将模型状态设置为无效状态。 (1)
  • 还有JSON.NET库的注释,用于更改模型的序列化/反序列化方式。我非常有信心(但不确定)Json.net的Validate Schema在验证架构时会考虑'Required'属性。
  • 其他属性装饰器用于Web服务,但“必需”不是我知道它在此方案中使用的。
  • Web api使用此属性在文档帮助页面和模型绑定上标记属性。
  • 您可以创建自己的应用程序逻辑,以了解“必需”属性。例如,在视图中标记属性,如果需要,则在标签中标记*。

这是一些用途,但您不限于此。

(1)注意:如果你的属性是一个int,你用Required来装饰它,模型状态将永远不会处于无效状态。您应该为此用例使用Nullable属性。

答案 4 :(得分:0)

在C#中,属性几乎是类和属性的装饰。

除了一些与安全相关的属性外,大多数都没有做任何事情。它们被更高级别的框架用来做某事。

对于ASP.NET 4 MVC,仅当对象是请求时,该属性用于生成错误。

如果要在任何其他环境中使用该属性,则必须编写代码以进行检查。

它不会从普通的public static void Main()

做任何事情

答案 5 :(得分:-1)

  

指定需要数据字段值。

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute(v=vs.110).aspx

有几个属性属性可以操纵此属性的应用方式。

MSDN article讨论如何使用验证属性来注释对象模型。