如何为我的POCO(模板)类添加验证

时间:2011-02-26 16:51:57

标签: asp.net asp.net-mvc validation entity-framework-4 poco

所以我使用this教程来生成我将在我的应用程序中使用的poco类..问题是我不应该修改生成的cs文件导致它们被自动生成...我该如何添加像[必需]等类似的东西?请帮忙

3 个答案:

答案 0 :(得分:23)

您无法直接添加它(除非您修改T4模板为您创建它们),但您可以尝试使用ASP.NET动态数据中引入的技巧。所有POCO类都定义为部分类。所以我们来定义你的部分内容:

using System.ComponentModel.DataAnnotations;

[MetadataType(typeof(MyClassMetadata))]
public partial class MyClass
{
  private class MyClassMetadata
  {
     [Required]
     public object Id;

     [Required]
     [StringLength(100)]
     public object Name;
  }
}

元数据类是仅保存元数据的特殊类型 - 从不使用它。字段名称必须与实际类中的相应字段相同(字段类型无关紧要,因此您可以使用object)。

无论如何,在ASP.NET MVC中,应该为每个视图使用专门的View模型并传递您需要的数据,以便将验证属性放置在视图模型类中。

答案 1 :(得分:0)

生成的POCO上的属性来自模型中实体的构面。例如对于[Required],请确保该字段为“非空”,对于[StringLength(n)],请确保nvarchar(n)方面的数据类型为MaxLength

答案 2 :(得分:0)

进一步扩大答案。通过使用Microsoft Patterns&实践企业库5验证块,除了通过普通数据注释提供的可能性之外,您还可以开辟一系列验证可能性。

using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;

[HasSelfValidation]
public partial class Category : ICategory
{
    [SelfValidation]
    public void Validate(ValidationResults validationResults)
    {
        if (this.Title === "Credo")
        {
            validationResults.AddResult(
                new ValidationResult(
                    "Category title cannot be a veiled reference to a former cool 2000AD character.",
                    this,
                    null,
                    null,
                    null));
        }

        validationResults.AddAllResults(
            ValidationFactory
            .CreateValidator<ICategory>()
            .Validate(this));
    }
}

using System;
using System.ComponentModel.DataAnnotations;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;

public interface ICategory
{
    int Id
    {
        get; 
        set;
    }

    [Required]
    [StringLengthValidator(1, 50, MessageTemplate = "Category title should be a maximum of 50 characters in length.")]
    string Title
    {
        get; 
        set;
    }
}