日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解ASP.NET MVC中屬性標(biāo)記的通用擴(kuò)展方法

本文將討論的是ASP.NET MVC中屬性標(biāo)記的通用擴(kuò)展方法,在這里我們也將更進(jìn)一步的了解ASP.NET MVC的作用。希望大家能用好ASP.MVC。

創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的烏什網(wǎng)站設(shè)計(jì)、移動媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

#T#

之前寫過一篇文章《ASP.NET MVC中的驗(yàn)證》,唯一的遺憾就是在使用Data Annotation Validators方式驗(yàn)證的時(shí)候,如果數(shù)據(jù)庫是Entityframework等自動生成的文件,就沒有辦法使用擴(kuò)展屬性標(biāo)記進(jìn)行標(biāo)記。現(xiàn)在已經(jīng)開始有了一些其它的ASP.NET MVC 驗(yàn)證框架,使用上跟Data Annotation Validators差不太多,但是普遍有這樣的問題,如果數(shù)據(jù)庫是Entityframework生成的edm文件,沒有辦法進(jìn)行擴(kuò)展屬性標(biāo)記。

今天在網(wǎng)上發(fā)現(xiàn)了另外一個(gè) ASP.NET MVC 驗(yàn)證框架---xVal框架,使用上跟Data Annotation Validators非常接近,也有類似的問題。

簡單介紹下,xVal是一個(gè)開源的ASP.NET MVC驗(yàn)證框架,有關(guān)它的介紹,可以參考:《xVal - a validation framework for ASP.NET MVC》

xVal使用了MS-PL的開源協(xié)議 ,也就是說,它允許用戶看、修改和分發(fā)源代碼,而不論出自商業(yè)用途還是非商業(yè)用途,類似BSD許可證。

 

xVal可以通過IRulesProvider接口,通過這個(gè)接口可以進(jìn)行擴(kuò)展,很明顯,它只擴(kuò)展了Castle框架跟NHibernate框架,通過如下兩個(gè)程序集就可以看出來:

xVal.RulesProviders.CastleValidator.dllxVal.RulesProviders.NHibernateValidator.dll基本上可以得出結(jié)論:xVal沒有提供對Entityframework框架的擴(kuò)展,還需要我們做擴(kuò)展。

最終,網(wǎng)上的一片文章給了我提示,問題得到了解決,解決的思路就是建立一個(gè)伙伴類,這個(gè)伙伴類跟原來的類的結(jié)構(gòu)定義是一樣的,在進(jìn)行驗(yàn)證的時(shí)候,不對edm文件中的類進(jìn)行驗(yàn)證,而是對伙伴類進(jìn)行驗(yàn)證。

這里就以xVal框架為例進(jìn)行Demo演示吧。

首先我們建立一個(gè)類模擬Entityframework生成的edm文件中的類,類的定義代碼如下:

模擬EF中的User類

 
 
 
  1. public partial class User  
  2. {  
  3.     public string UserName { getset; }  
  4.     public string Password { getset; }  
  5.     public string Address { getset; }  
  6.     public string Telephone { getset; }  
  7.     public int Age { getset; }  
  8.     public string Email { get;set;}  

接下來我們建立一個(gè)伙伴類

伙伴類的代碼

 
 
 
  1. public class UserMetadata  
  2.     {  
  3.         [Required]  
  4.         [StringLength(10)]  
  5.  
  6.         public string UserName { getset; }  
  7.  
  8.         [Required]  
  9.         [StringLength(18)]  
  10.         [DataType(DataType.Password)]  
  11.         public string Password { getset; }  
  12.  
  13.         [Required]  
  14.         [StringLength(100)]  
  15.         public string Address { getset; }  
  16.  
  17.         [Required]  
  18.         [DataType(DataType.PhoneNumber)]  
  19.         public string Telephone { getset; }  
  20.  
  21.         [Required]  
  22.         [Range(1, 100)]  
  23.         public int Age { getset; }  
  24.  
  25.         [Required]  
  26.         [DataType(DataType.EmailAddress)]  
  27.         public string Email { getset; }  
  28.     }  

再接下來,我們使用partial關(guān)鍵字為User類進(jìn)行擴(kuò)展,擴(kuò)展類的定義如下:

擴(kuò)展類的定義

 
 
 
  1. [MetadataType(typeof(UserMetadata))]  
  2. public partial class User  
  3. {     

注意這段代碼:[MetadataType(typeof(UserMetadata))] 

為了方便大家閱讀,我把整體代碼貼出來,整體代碼如下:

整體代碼

 
 
 
  1. using System.ComponentModel.DataAnnotations;   
  2.  
  3. namespace MVCValidate.Models  
  4. {  
  5.     public partial class User  
  6.     {  
  7.         public string UserName { getset; }  
  8.         public string Password { getset; }  
  9.         public string Address { getset; }  
  10.         public string Telephone { getset; }  
  11.         public int Age { getset; }  
  12.         public string Email { get;set;}  
  13.     }  
  14.  
  15.     [MetadataType(typeof(UserMetadata))]  
  16.     public partial class User  
  17.     {   
  18.           
  19.     }  
  20.     public class UserMetadata  
  21.     {  
  22.         [Required]  
  23.         [StringLength(10)]  
  24.  
  25.         public string UserName { getset; }  
  26.  
  27.         [Required]  
  28.         [StringLength(18)]  
  29.         [DataType(DataType.Password)]  
  30.         public string Password { getset; }  
  31.  
  32.         [Required]  
  33.         [StringLength(100)]  
  34.         public string Address { getset; }  
  35.  
  36.         [Required]  
  37.         [DataType(DataType.PhoneNumber)]  
  38.         public string Telephone { getset; }  
  39.  
  40.         [Required]  
  41.         [Range(1, 100)]  
  42.         public int Age { getset; }  
  43.  
  44.         [Required]  
  45.         [DataType(DataType.EmailAddress)]  
  46.         public string Email { getset; }  
  47.     }  

接下來,我們要實(shí)現(xiàn)伙伴類跟原類的替換方法了,代碼如下所示:

DataAnnotationsValidationRunner類的代碼

 
 
 
  1. using System.Collections.Generic;  
  2. using System.ComponentModel;  
  3. using System.ComponentModel.DataAnnotations;  
  4. using System.Linq;  
  5. using xVal.ServerSide;  
  6.  
  7. namespace MVCValidate.Models  
  8. {  
  9.     internal static class DataAnnotationsValidationRunner  
  10.     {  
  11.         // TODO: DOES NOT SUPPORT METADATA TYPE  
  12.         ///// Warning: For some reason, DataTypeAttribute.IsValid() always returns "true", regardless of whether  
  13.         ///// it is actually valid. Need to improve this test runner to fix that.  
  14.         //public static IEnumerable GetErrors(object instance)  
  15.         //{  
  16.         //    return from prop in TypeDescriptor.GetProperties(instance).Cast()  
  17.         //           from attribute in prop.Attributes.OfType()  
  18.         //           where !attribute.IsValid(prop.GetValue(instance))  
  19.         //           select new ErrorInfo(prop.Name, attribute.FormatErrorMessage(string.Empty), instance);  
  20.         //}  
  21.  
  22.         ///   
  23.         /// Get any errors associated with the model also investigating any rules dictated by attached Metadata buddy classes.  
  24.         ///   
  25.         ///   
  26.         ///   
  27.         public static IEnumerable GetErrors(object instance)  
  28.         {  
  29. var metadataAttrib = instance.GetType().GetCustomAttributes(typeof(MetadataTypeAttribute), true)
  30. .OfType().FirstOrDefault();  
  31.             var buddyClassOrModelClass = metadataAttrib != null ? metadataAttrib.MetadataClassType : instance.GetType();  
  32.             var buddyClassProperties = TypeDescriptor.GetProperties(buddyClassOrModelClass).Cast();  
  33.             var modelClassProperties = TypeDescriptor.GetProperties(instance.GetType()).Cast();  
  34.  
  35.             return from buddyProp in buddyClassProperties  
  36.                    join modelProp in modelClassProperties on buddyProp.Name equals modelProp.Name  
  37.                    from attribute in buddyProp.Attributes.OfType()  
  38.                    where !attribute.IsValid(modelProp.GetValue(instance))  
  39.                    select new ErrorInfo(buddyProp.Name, attribute.FormatErrorMessage(string.Empty), instance);  
  40.         }  
  41.     }  

完成以上的代碼以后,大部分工作就完成了,接下來,我們在Controller中編寫一個(gè)create方法,來模擬Create操作,代碼如下所示:

Controller層的代碼

 
 
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.Mvc;  
  6. using System.Web.Mvc.Ajax;  
  7.  
  8. using MVCValidate.Models;  
  9. using xVal.ServerSide;  
  10.  
  11. namespace MVCValidate.Controllers  
  12. {  
  13.     public class UserController : Controller  
  14.     {  
  15.         [AcceptVerbs(HttpVerbs.Post)]  
  16.         public ActionResult Create(User user)  
  17.         {  
  18.             var errors = DataAnnotationsValidationRunner.GetErrors(user);  
  19.             if (errors.Any())  
  20.             {  
  21.                 new RulesException(errors).AddModelStateErrors(ModelState,"user");  
  22.             }  
  23.  
  24.             return View();  
  25.         }  
  26.     }  

 接下來,編寫View層的代碼,比較簡單,我就直接貼出來了,代碼如下:

View層的代碼

 
 
 
  1. <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> 
  2.  xmlns="http://www.w3.org/1999/xhtml" > 
  3.  runat="server"> 
  4.     </strong>Create<strong> 
  5.  
  6.  
  7.     <%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %> 
  8.     <% using (Html.BeginForm()) {%> 
  9.  
  10.         
     
  11.             Fields 
  12.             

     

  13.                  for="UserName">UserName: 
  14.                 <%= Html.TextBox("user.UserName") %> 
  15.                 <%= Html.ValidationMessage("user.UserName")%> 
  16.             

     
  17.             

     

  18.                  for="Password">Password: 
  19.                 <%= Html.TextBox("user.Password") %> 
  20.                 <%= Html.ValidationMessage("user.Password")%> 
  21.             

     
  22.             

     

  23.                  for="Address">Address: 
  24.                 <%= Html.TextBox("user.Address")%> 
  25.                 <%= Html.ValidationMessage("user.Address")%> 
  26.             

     
  27.             

     

  28.                  for="Telephone">Telephone: 
  29.                 <%= Html.TextBox("user.Telephone")%> 
  30.                 <%= Html.ValidationMessage("user.Telephone")%> 
  31.             

     
  32.             

     

  33.                  for="Age">Age: 
  34.                 <%= Html.TextBox("user.Age")%> 
  35.                 <%= Html.ValidationMessage("user.Age")%> 
  36.             

     
  37.             

     

  38.                  for="Email">Email: 
  39.                 <%= Html.TextBox("user.Email")%> 
  40.                 <%= Html.ValidationMessage("user.Email")%> 
  41.             

     
  42.             

     

  43.                  type="submit" value="Create" /> 
  44.             

     
  45.          
  46.     <% } %> 
  47.     
     
  48.         <%=Html.ActionLink("Back to List", "Index") %> 
  49.     
 
  •  
  •  
  • 最終的效果如下圖所示:

    ASP.NET MVC開源驗(yàn)證框架非常的多,只是有相似問題的更多,有了這個(gè)通用的方法,就可以很容易對其他驗(yàn)證框架進(jìn)行擴(kuò)展了。


    文章題目:詳解ASP.NET MVC中屬性標(biāo)記的通用擴(kuò)展方法
    URL地址:http://www.5511xx.com/article/dhhgiod.html