无法在asp.net vnext类库中使用required属性

时间:2015-02-23 19:03:30

标签: c# asp.net asp.net-mvc class-library

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

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

案例:
1.使用默认设置添加asp.net vnext类库项目 2.使用字符串属性Human创建类Name 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类库中使用{{1}}。为什么呢?

1 个答案:

答案 0 :(得分:5)

vNext Web项目依赖于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程序集用于新的Core CLR。它包含Required属性,适用于Core CLR。​​

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

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

我觉得这篇文章很有意思。它解释了这些合同组件在帖子结尾处的内容。 http://alxandr.me/2014/07/20/the-problems-with-portable-class-libraries-and-the-road-to-solving-them/