无法在 asp.net vnext class 库中使用必需的属性

Can't use required attribute in the asp.net vnext class library

更新:当然我尝试添加using System.ComponentModel.DataAnnotations。没用。

问题:我无法在 asp.net vnext class 库项目中使用 Required 属性。

案例:
1. 添加asp.net vnext class 库工程,默认设置
2. 用字符串 属性 Name.
创建 class Human 3.将Required属性添加到Name.
4.获取编译错误:

Error   CS0246  The type or namespace name 'Required' could not be found (are you missing a using directive or an assembly reference?)  

下面是我的project.json:

{
    "version": "1.0.0-*",
    "dependencies": {
        "System.ComponentModel.Annotations": ""
    },
    "frameworks": {
        "aspnet50": {
        },
        "aspnetcore50": {
            "dependencies": {
                "System.Runtime": ""
            }
        }
    }
}

我还可以在 asp.net vnext 中使用 DataAnnotations,但不能在 vnext class 库中使用。为什么?

vNext 网络项目依赖于 Microsoft.AspNet.Mvc。这拉入了一个大依赖树,数据注解在包Microsoft.DataAnnotations

Microsoft.DataAnnotations 添加依赖项以使用数据协定属性。

在你的project.json文件中更改

"dependencies": {
    "System.ComponentModel.Annotations": ""
},

"dependencies": {
     "Microsoft.DataAnnotations":  "1.0.0-beta1"
},

将 1.0.0-beta1 替换为当前版本号。 Visual studio 将为您自动完成。


为什么 Microsoft.DataAnnotations 有效而不是 System.ComponentModel.Annotations

根据一点调查System.ComponentModel.Annotations包含两个目标

  • aspnetcore50\System.ComponentModel.Annotations.dll
  • contract\System.ComponentModel.Annotations.dll

aspnetcore50 程序集用于新的核心 CLR。它包含 Required 属性并适用于核心 CLR。​​

contract 程序集包含所有类型,但方法是空的。它就像一个必须由框架实现的虚拟依赖。此虚拟程序集用于 .NET 4.5,这就是为什么同时针对 .NET 4.5 和 Core CLR 的项目找不到 Required 属性的原因。

另一方面,Microsoft.DataAnnotations 包依赖于 System.ComponentModel.Annotations,但也引用了框架程序集 System.ComponentModel.DataAnnotations,当您在 .NET 4.5 上 运行 时,它实际上提供了类型

我发现这个 post 很有趣。它在 post 末尾解释了这些合约程序集是什么。 http://alxandr.me/2014/07/20/the-problems-with-portable-class-libraries-and-the-road-to-solving-them/