代码之家  ›  专栏  ›  技术社区  ›  Omar

ASP.NET MVC,Linq to SQL数据注释验证

  •  12
  • Omar  · 技术社区  · 15 年前

    我正在尝试实现对LinqToSQL对象的数据注释。生成了.dbml文件,我不知道如何在不接触生成的源代码的情况下向对象添加数据注释。

    我试图将数据注释添加到对象的一个单独的分部类中,但它没有识别它,也没有智能感知。

    4 回复  |  直到 9 年前
        1
  •  22
  •   Micah    14 年前

    正如我在这个问题的原始答案中所说,您应该使用一个接口。我的答案贴在后面(标记为“接受”)说要使用一个班级。这不是很好。接口是更好的选择,原因如下:

    • 如果linq类中的名称与接口中的名称不匹配,编译器将为您标记它。
    • 无法实例化接口,因此这样可以防止类用户意外地初始化元数据类型。
    • 如果您使用Resharper(或类似工具),则可以从Linq类中自动提取接口。
    • 接口没有空类那么冗长
    • 如果您根据接口而不是类编程(这是一个很好的实践),那么您已经有了一个可以用作元数据类型的接口。

    对于名为“user”的类,请为其创建一个接口(称为“iuser”),然后按以下方式更新部分用户类的定义:

    [MetadataType(typeof(IUser))]
    public class User : IUser
    

    然后,在IUser接口中,向属性添加适当的数据注释属性:

    [Required]       
    [StringLength(50, ErrorMessage = "Username cannot exceed 50 characters")]
    string Username { get; set; }
    
        2
  •  9
  •   jphoward    15 年前

    对于名为“user”的类,请为其创建一个接口(称为“iuser”),然后按以下方式更新部分用户类的定义:

    [MetadataType(typeof(IUser))]
    public class User : IUser
    

    然后,在IUser接口中,向属性添加适当的数据注释属性:

    [Required]       
    [StringLength(50, ErrorMessage = "Username cannot exceed 50 characters")]
    string Username { get; set; }
    
        3
  •  6
  •   Omar    15 年前

    linq to sql将对象类生成为分部。实现数据注释的一个简单方法是创建自己的对象分部类,将[MetadataType(typeof(yourdataAnnotationClass))]放在创建的分部类上。

    例子:

    // Linq to SQL Class
    public partial class Article 
    {
       public string Title { get; set; }
       ...... etc
    }
    

    为要验证的每个字段创建带有元数据的自己的元数据类

    public class MyMetaDataClass
    {
        [Required]
        [Range(5,20)]
        public string Title { get; set; }
    }
    

    为要向其中添加元数据的对象类创建分部类,在本例中是项目类:

    [MetadataType(typeof(MyMetaDataClass))]
    public partial class Article { }
    

    注意:您不需要在类中指定任何内容,只需要指定元数据类型。

        4
  •  2
  •   marc_s    11 年前

    谢谢,但问题是MS将metadatatypeattruute的原型定义为

    [AttributeUsageAttribute(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
    public sealed class MetadataTypeAttribute : Attribute
    

    所以,您必须使用类,而不是接口


    来自中国 森林李:___ 邮箱:xiaoqianglinsen@163.com(msn) 邮箱:lixiaoqiang@webservice.com.cn