• Linq to SQL 加注Data Annotation在 Asp.Net MVC2中的应用


    首先我们来做一个比较,自定义Model加Annotation,如表1所示:

    图表1:Product Class 的定义

    1 public class Product
    2 {
    3 [DisplayName("Product Name")]
    4 [Required(ErrorMessage="Product Name is Required.")]
    5 [StringLength(50,ErrorMessage="Max Length of Product Name can not greater than 50 characters.")]
    6 public string Name
    7 {
    8 get;
    9 set;
    10 }
    11
    12 [DisplayName("Product Type")]
    13 [Required(ErrorMessage = "Product Type is Required.")]
    14 [StringLength(20, ErrorMessage = "Max Length of Product Name can not greater than 20 characters.")]
    15 public string Type
    16 {
    17 get;
    18 set;
    19 }
    20 }

    Controller 定义如图表2所示:

    图表2:Product Controller的使用

    1 public class ProductController : Controller
    2 {
    3 public ActionResult CreateProduct()
    4 {
    5 this.ViewData.Model = new Product();
    6 return View();
    7 }
    8
    9 [HttpPost]
    10 public ActionResult CreateProduct(Product p)
    11 {
    12 if (this.ModelState.IsValid)
    13 {
    14 //Save Data
    15 }
    16 else
    17 {
    18 this.ViewData.Model = p;
    19 }
    20 return View();
    21 }
    22 }

    在Site.Master中加入如图表3所示:

    图表3:Enable Client Validation

    1 <script type="text/javascript" src="<%=Url.Content("~/Scripts/MicrosoftAjax.js") %>" ></script>
    2
    3 <script type="text/javascript" src="<%=Url.Content("~/Scripts/MicrosoftMvcValidation.js") %>" ></script> <% Html.EnableClientValidation(); %>

     View代码如图表4所示:

    图表4:View中对Product的应用

    1 <%using (Html.BeginForm())
    2 { %>
    3 <p>
    4 <%=Html.LabelFor(Model => Model.Name)%>
    5 <%=Html.TextBoxFor(Model => Model.Name)%>
    6 <%=Html.ValidationMessageFor(Model => Model.Name)%>
    7 </p>
    8 <p>
    9 <%=Html.LabelFor(Model => Model.Type)%>
    10 <%=Html.TextBoxFor(Model => Model.Type)%>
    11 <%=Html.ValidationMessageFor(Model => Model.Type)%>
    12 </p>
    13 <input type="submit" value="Submit" />
    14 <%} %>

      上面我们定义了Model Product,定义了两具属性,分别是Name和Type,并且给他们加了Annotation(注意:DisplayName是 System.ComponentModel命名空间下面的),Asp.net MVC2在做Validation的时候,他会根据我们所加注的这些Annotation对对应的Property进行验证。然后我们在Site.Master指定他们进行Client端验证,在Create Product 的View中我们加以应用,当我们点Submit的时候,它并没有做Postback,并且帮我们做了所需求的 Validation,如图表5所示,这使得我们MVC的开发更方便、更简洁,同时也带了更好的视觉效果。

    图表5:View调用的结果

     

    三.Linq to SQL MVC2的问题与本文解决方案                   

       Ok,上面是我们传统的做法,但是在我们的项目中使用的是Linq to SQL,之所以使用Linq to SQL,是因为我们只需要把Database中的Table、 Stored Procedure或者Function等拖到我们的Linq to SQL文件中,他就会帮我们生成对应的强类型文件,方便我们的使用,特别是在Asp.Net  MVC中的使用。 但是我们如何给Linq to SQL生成的类类型加Data Annotation呢?

      首先我们可以简单的想,直接在Linq to SQL 生成的cs文件中引用System.ComponentModel.DataAnnotations,然后在对应的Property中加我们所需要的Annotatio,从理想的状态来讲,我们说这个方案是可行的,但是前提条件是你所设计的Table、Stored Procedure或者Function 结构不会再更改,因为当我们Linq to SQL里的对象在Database的结构发生变化时,我们需要删除Linq to SQL文件中的对象,然后从Database重新的拖入,以生成更新后的强类型文件,那么我们之前加入的Annotation也会被删除掉,后果就是我们需要重新加注Data Annotation,这样会增加我们很大的工作量, 那么我们如何来解决这样的问题呢?

      在Linq to SQL中,如果你的Database的表的名称是T_PRODUCT,那么当你把表插入到Linq to SQL的文件中生,他会帮我们生成对应名称为T_PRODUT的Class。如图表6所示:

    图表6:Database Table在Linq to SQL中显示

     

      我们的解决方案是定义一个新的Class(我们这里叫ProductAnnotation),然后在里面加入哪些需要加注Annotation的Properties(Property的名字需要和T_PRODUCT表中的字段相同),如图表7所示:

    图表7:为T_PRODUCT表定义Data Annotation

    1 public class ProductAnnotation
    2 {
    3 [DisplayName("Product Name")]
    4 [Required(ErrorMessage = "Product Name is Required.")]
    5 [StringLength(50, ErrorMessage = "Max Length of Product Name can not greater than 50 characters.")]
    6 public string Name { get; set; }
    7
    8 [DisplayName("Product Type")]
    9 [Required(ErrorMessage = "Product Type is Required.")]
    10 [StringLength(20, ErrorMessage = "Max Length of Product Name can not greater than 20 characters.")]
    11
    12 public string Type { get; set; }
    13 }

      可以看出,这和我们之前定义的那Product没有多大差别,关键在于这里面只需要加入那些我们需要的字段,例如表里的Oid我们不需要,那么就没有必要放进来,这使用我们的设计更加自由。上面我们定义完了所需要的Annotation,也解决了本文开始的第一个问题。下面我们需要做的事情就是把定义的这个包含Annotation的Class和我们的T_PRODUCT表进行绑定,方法如图表8所示:

    图表8:联合(绑定)Data Annotation到Linq to SQL中T_PRODUCT Class

    1 [MetadataType(typeof(ProductAnnotation))]
    2 public partial class T_PRODUCT
    3 {
    4
    5 }

      上面 partial的意思就是对T_PRODUCT表进行部分定义,关键在于在它的上面有一个MetadataType的Atrribute,并且里面所引用的正是我们上面所定义的Class,System.ComponentModel.DataAnnotations命名空间下的MetadataType Attribute的作用就是将两个进行整合,但是Asp.Net MVC 去读那些Validation的时候,他就会去从我们定义的ProductAnnotation中对应的字段去读取。

       假设我们把Database中T_PRODUCT表中的Name改成了ProductName,我们需要把Linq to SQL的中对应的表重新拖入,生成新的强类型Class,到我们的ProductAnnotation Class中修改相应的名称即可,而无须重新加注所有字段了,其它修改类似,这也就解决了本文的问题。

      以上就是我们的解决方案,他实现的效果和我们上面所实现 的效果是一样的。

    四.总结                          

      通过对Asp.Net MVC2  Data Annotation的分析,介绍了如何通过实现对Linq to SQL加注Data Annotation。通过上面的分析主要了解了如下内容:

    1. Asp.Net MVC2中利用Data Annotation定义Validation的使用。
    2. 实现对Linq to SQL生成的强类型Class加Validation的方法。
  • 相关阅读:
    jdk环境变量配置
    智商太低,竟然算不出病狗神题了
    HDU 1284 钱币兑换问题 母函数、DP
    linux下实现监控进程网络带宽
    编程算法
    C語言 rand函数 进阶探讨与实现
    JDBCUtil
    iOS进阶路线以及进阶书籍
    Windows平台CUDA开发之前的准备工作
    数据库中substring的用法 CONVERT(varchar(12) , getdate(), 112 )
  • 原文地址:https://www.cnblogs.com/leeolevis/p/1776521.html
Copyright © 2020-2023  润新知