Asp.net mvc web项目中的ASP.NET MVC数据注释域模型

Asp.net mvc web项目中的ASP.NET MVC数据注释域模型,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我以前在博客上看到过如何做到这一点,但我忘了在哪里或如何做到。假设我在类库中有一个域。我想在web项目中将此域的属性作为我的viewmodel进行数据注释 我如何做到这一点 比如说。此域位于我的类库中: public class Person { public int Id {get; set;} public string FirstName {get; set;} } 在我的web项目中,有以下内容: //Do i need to set some attribute here

我以前在博客上看到过如何做到这一点,但我忘了在哪里或如何做到。假设我在类库中有一个域。我想在web项目中将此域的属性作为我的viewmodel进行数据注释

我如何做到这一点

比如说。此域位于我的类库中:

public class Person {
   public int Id {get; set;}
   public string FirstName {get; set;}
}
在我的web项目中,有以下内容:

//Do i need to set some attribute here?
public class CreatePersonViewModel{

   [Required()]
   [DisplayName("First Name")]
   public string FirstName {get; set;}
}

此代码可以映射到
人员
,无需工具。可能是部分的或其他的。

你是在说这类事情吗

using System.ComponentModel.DataAnnotations;

public MyClass
{


    [DisplayName("Street Address")]
    public string StreetAddress { get; set; }

}
编辑:

如果需要向生成的类(如实体)添加数据注释,请执行以下操作:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel;

namespace Something

{
    [MetadataType(typeof(MetaMyClass))]
    public partial class MyClass
    {
          //You can just leave this empty if you have nothing additional to add to the class

    }

    public class MetaMyClass
    {
        [DisplayName("Street Address")]
        public string StreetAddress { get; set; }
    }
 }

您的意思是注释域对象还是视图模型对象

使用
System.ComponentModel.DataAnnotations
验证属性(并从
ValidationAttribute
派生您自己的任何属性),您可以在模型绑定点验证绑定到viewmodel属性的值

Scott Guthrie有一个


编辑:您在对另一个海报的评论中说您的类型已经存在。您可以将添加到现有类型中,以指示另一个类型,该类型包含要应用于现有类型属性的验证逻辑。

您可以为数据批注属性创建“buddy”类

[MetadataType(typeof(ResourceMetadata))]
public partial class Resource
{
   public object Value { get; set; }
}

public class ResourceMetadata
{
  // The metadata class can define hints  

  [UIHint("ResourceValue")]
  public object Value { get; set; }
}

使用视图模型的整个想法是将其与域模型分离,并使其具有适合视图需要的内容。视图模型应在web项目中声明,并包含此特定视图可能需要的所有必要属性和格式属性。域模型不应被h任何视图特定的数据注释。因此,如果您的模型如下所示:

public class Person {
   public int Id { get; set; }
   public string FirstName { get; set; }
}
您可以具有以下视图模型:

public class CreatePersonViewModel {
   [Required]
   [DisplayName("First Name")]
   public string FirstName { get; set; }
}

然后让控制器从某个存储库获取模型,将其映射到视图模型(这里可以帮助您),并将视图模型传递给视图。

是,但是
MyClass
已经存在,我无法使用
[DisplayName(“Street Address”)]
在它上面。有一种方法可以向它添加注释。我正在研究这个问题:我不能将
[MetadataTypeAttribute]
放在原始模型上,因为它不知道viewmodel。或者是另一种方法吗?viewmodels背后的思想是它们旨在向(和从)传递数据将视图添加到控制器中。它们不一定与域对象有
code
关联(如关联它们的属性、继承等)。在控制器内部,您可能会执行视图模型和域对象之间的值映射。您不能使用视图模型,而只是将域对象传递给视图,但由于模型验证的工作方式,在执行此操作时需要注意某些问题。请看一看Brad Wilson关于模型验证的帖子-。他说关于MVC 1和MVC 2之间分别从输入验证到模型验证的转变,但是他关于模型验证的说法仍然适用于MVC 2和MVC 3。不,您不需要在有
//我需要在这里设置一些属性吗?
。如果您的控制器操作的参数类型为
CreatePersonViewModel
,验证属性将运行以确定
ModelState
是否有效。我否决了所有鼓励使用元数据类的答案。元数据伙伴类完全使拥有域或分离关注点的目的无效。UI应指向您的域,而不是指向您的域这是一种可怕的做法,应该加以劝阻。@jfar:严格地说,元数据类是在分离一个关注点——尽管这不是一件容易做到的事情。固执己见是好的,但你在这里的行为会带来不利影响:在生成模型的情况下,很可能无法对其进行注释保留实际属性,但很可能您可以将属性添加到部分类定义中。我不同意-我在数据层中声明了注释,因为数据库字段“TownSubparent”总是有一个标签“Town/Subparent”…当我在多个前端共享数据库时,为什么我要在我的视图中为我的站点的不同组件设置2、3、4次此选项?@Rob,因为你将模型绑定到一个特定的演示文稿。如果在另一个应用程序中,此字段应称为其他字段呢?这是正确的,因此此答案不正确-right的答案是“它取决于域”-另外,为什么要解耦特定于数据库列的验证规则?您不想更改INT列的验证规则,所以为什么不将其与模型紧密耦合?