自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談ASP.NET MVC 3中如何使用Model

開(kāi)發(fā) 后端
今天我們將要談到的是ASP.NET MVC 3中如何使用Model,用于遠(yuǎn)程驗(yàn)證等功能上。歡迎大家加入討論。

昨天博客發(fā)了新文章,講一下我對(duì)如何使用MVC中的Model的看法,不是什么大技術(shù),當(dāng)是一個(gè)技術(shù)討論^^

原文地址:http://www.youguanbumen.net/Article.aspx?id=79

原文:

前兩天寫(xiě)了個(gè)文章ASP.NET MVC 3 —— Model遠(yuǎn)程驗(yàn)證,主要記錄了一下ASP.NET MVC 3中新增的RemoteAttribute類的使用,得益于這個(gè)類,我們可以在模型中為屬性配置客戶端遠(yuǎn)程校驗(yàn)的業(yè)務(wù),文章中給了出一個(gè)簡(jiǎn)單的實(shí)體類MyUser_Add,舉了一個(gè)最常見(jiàn)的注冊(cè)用戶時(shí)驗(yàn)證用戶名是否存在的例子,最后成功地對(duì)用戶名實(shí)現(xiàn)了用ajax加薪校驗(yàn)的功能。給出Model的代碼如下:

  1. /// <summary>  
  2. /// 用戶添加操作的模型  
  3. /// </summary>  
  4. publicclassMyUser_AddModel  
  5. {  
  6.     #region MyRegion  
  7.     /// <summary>  
  8.     /// 用戶名  
  9.     /// </summary>  
  10.     [DisplayName("登錄賬號(hào)")]  
  11.     [Required(ErrorMessage = "用戶賬號(hào)不能為空")]  
  12.     [Remote("CheckUserAccountExists""Test", ErrorMessage = "用戶賬號(hào)已存在")] 
  13. // 遠(yuǎn)程驗(yàn)證(Ajax)  
  14.     publicstringUserAccount { getset; }  
  15. }   
  16.  
  17.       
  18.  

文章發(fā)到博客園上面之后有朋友提出一了一點(diǎn):“這個(gè)我們可以認(rèn)為在創(chuàng)建的時(shí)候解決重復(fù)問(wèn)題,但是如果是Update的話,我相信這樣的語(yǔ)句應(yīng)該也會(huì)報(bào)錯(cuò)誤的”。就是說(shuō)如果這個(gè)Model用于做Update操作的時(shí)候,校驗(yàn)用戶名是否存在的方法和Add操作會(huì)有點(diǎn)不同,因?yàn)橐炎约号懦谕?,例如原?lái)的用戶名叫”user1“修改后還叫”user1“,這時(shí)候判斷用戶名是否存在的標(biāo)準(zhǔn)是”如果存在用戶名是‘user1’的并且用戶ID號(hào)不是當(dāng)前這個(gè)要修改的用戶,那么用戶不可用(存在)“,而Add操作的時(shí)候不存在”自己“,所以我看可以理解為兩個(gè)操作都需要判斷用戶名是否存在,但是使用了不同的策略!

剛好之前看了ASP.NET MVC 3自帶的Demo(就是創(chuàng)建MVC3.0項(xiàng)目后生成的那個(gè)- -?。雽?xiě)一下我自己認(rèn)為的”微軟希望我們?cè)趺慈ピO(shè)計(jì)MVC中的Model”的看法,發(fā)現(xiàn)似乎和這個(gè)問(wèn)題有點(diǎn)聯(lián)系,以下是我個(gè)人的觀點(diǎn):

首先我們看下Demo項(xiàng)目中Models目錄下的AccountModels.cs,下面的代碼摘自這個(gè)文件中的兩個(gè)我認(rèn)為很有代表性的類,都是和用戶有關(guān)的,源代碼如下:

  1. publicclassLogOnModel  
  2. {  
  3.     [Required]  
  4.     [Display(Name = "User name")]  
  5.     publicstringUserName { getset; }  
  6.     [Required]  
  7.     [DataType(DataType.Password)]  
  8.     [Display(Name = "Password")]  
  9.     publicstringPassword { getset; }  
  10.     [Display(Name = "Remember me?")]  
  11.     publicboolRememberMe { getset; }  
  12. }  
  13. publicclassRegisterModel  
  14. {  
  15.     [Required]  
  16.     [Display(Name = "User name")]  
  17.     publicstringUserName { getset; }  
  18.     [Required]  
  19.     [DataType(DataType.EmailAddress)]  
  20.     [Display(Name = "Email address")]  
  21.     publicstringEmail { getset; }  
  22.     [Required]  
  23.     [ValidatePasswordLength]  
  24.     [DataType(DataType.Password)]  
  25.     [Display(Name = "Password")]  
  26.     publicstringPassword { getset; }  
  27.     [DataType(DataType.Password)]  
  28.     [Display(Name = "Confirm password")]  
  29.     [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]  
  30.     publicstringConfirmPassword { getset; }  
  31. }  

注意上面兩個(gè)類的類名,我們很容易讀懂一個(gè)是“(用戶)登錄模型”,一個(gè)是“(用戶)注冊(cè)模型”,有意思的地方在于兩個(gè)類都用UserName、Password兩個(gè)屬性,UserName的驗(yàn)證方式完全一樣,而Password有所不同,RegisterModel中多了一個(gè)ValidatePasswordLengthAttribute的特性——一個(gè)自定義驗(yàn)證特性。這兩個(gè)模型對(duì)應(yīng)的是不同的Action-View,于是我的理解是:Model是為了Actioin-View而存在的。例如,有一個(gè)頁(yè)面是用來(lái)顯示一張表單,這張表單會(huì)被提交到一個(gè)介紹Post請(qǐng)求的Action中,這時(shí)候就會(huì)創(chuàng)建一個(gè)和這個(gè)表單對(duì)應(yīng)的Model,用來(lái)在View和Action中充當(dāng)媒介的作用(所謂的“實(shí)體傳參”)。

回到上面那個(gè)檢測(cè)用戶名是否存在的問(wèn)題,基于這個(gè)想法可以得出一個(gè)解決方案,那就是創(chuàng)建另外一個(gè)新類,叫做MyUser_UpdateModel(用戶修改模型),可以得出以下的代碼

  1. publicclassMyUser_UpdateModel  
  2. {  
  3.     /// <summary>  
  4.     /// 用戶名  
  5.     /// </summary>  
  6.     [DisplayName("登錄賬號(hào)")]  
  7.     [Required(ErrorMessage = "用戶賬號(hào)不能為空")]  
  8.     [ValidateUserAccountAttribute] // 自定義驗(yàn)證  
  9.     [Remote("CheckUserAccountExistsForUpdate""Test", ErrorMessage = "用戶賬號(hào)已存在")] // 遠(yuǎn)程驗(yàn)證(Ajax)  
  10.     publicstringUserAccount { getset; }  
  11. }  

注意到遠(yuǎn)程驗(yàn)證調(diào)用的是另外一個(gè)Action,這個(gè)Action的代碼如下:

  1.  /// <summary>  
  2. /// 用于驗(yàn)證用戶賬號(hào)是否存在的Action(Update操作時(shí)使用)  
  3. /// </summary>  
  4. /// <param name="UserAccount">用戶賬號(hào)</param>  
  5. /// <returns></returns>  
  6. [HttpGet]  
  7. public ActionResult CheckUserAccountExistsForUpdate(string UserAccount)  
  8. {  
  9.     var ms = ModelState;  
  10.     string[] existsUsers = { "wodanwojun" };  
  11.     bool exists = string.IsNullOrEmpty(existsUsers.FirstOrDefault(u => u.ToLower() == UserAccount.ToLower())) == false;  
  12.     return Json(!exists, JsonRequestBehavior.AllowGet);  
  13. }   
  14.  
  15.  
  16.    
  17.  
  18.     public class MyUser_UpdateModel  
  19.     {  
  20.         /// <summary>  
  21.         /// 用戶名  
  22.         /// </summary>  
  23.         [DisplayName("登錄賬號(hào)")]  
  24.         [Required(ErrorMessage = "用戶賬號(hào)不能為空")]  
  25.         [ValidateUserAccountAttribute] // 自定義驗(yàn)證  
  26.         [Remote("CheckUserAccountExistsForUpdate""Test", ErrorMessage = "用戶賬號(hào)已存在")] // 遠(yuǎn)程驗(yàn)證(Ajax)  
  27.         public string UserAccount { getset; }  
  28.     } 

這里假設(shè)要修改的用戶的用戶名叫做“youguanbumen”,所以驗(yàn)證的時(shí)候如果輸入了有關(guān)部門(mén)是不應(yīng)該提示“該賬號(hào)已存在”的(因?yàn)榫褪撬约海昧诉@個(gè)賬號(hào)是沒(méi)問(wèn)題的)??刂破鞯拇a我就不寫(xiě)咯,大致就是得到一個(gè)用戶名叫做“youguanbumen”的Model——MyUser_UpdateModel類,然后通過(guò)return View(object model)方法丟給View(當(dāng)然,View是強(qiáng)類型的——MyUser_UpdateModel類),測(cè)試結(jié)果截圖如下:

1、輸入“wodanwojun”作為用戶名,發(fā)現(xiàn)通不過(guò),就像下面這張截圖這樣,原因請(qǐng)見(jiàn)上面的代碼!

2、輸入“youguanbumen”作為用戶名。發(fā)現(xiàn)沒(méi)有錯(cuò)誤提示,就像下面這張截圖這樣,原因請(qǐng)見(jiàn)上面的代碼,并對(duì)照前一篇文章中另外一個(gè)用于遠(yuǎn)程校驗(yàn)的Action的代碼!

總結(jié)一下:似乎寫(xiě)出來(lái)的每一篇文章都不短但是講的東西都很少,呵呵,請(qǐng)別介意^_^。雖然寫(xiě)代碼的經(jīng)驗(yàn)很不多,但是個(gè)人對(duì)于代碼還是有一些自己的看法的。選擇一個(gè)框架來(lái)開(kāi)發(fā)一個(gè)系統(tǒng),就意味著在開(kāi)發(fā)的過(guò)程中你需要遵循某些約定好的東西,例如選擇WebForm來(lái)開(kāi)發(fā)系統(tǒng),就盡量的接受”事件相應(yīng)“和服務(wù)器端控件;選擇了MVC就要接受把C#代碼嵌到頁(yè)面去的這個(gè)事實(shí),當(dāng)然如果使用了某些RIA框架后可能不出現(xiàn)這種情況(因?yàn)轫?yè)面上的東西基本都是異步請(qǐng)求回來(lái)的)。特別是多人開(kāi)發(fā)的時(shí)候,我們有必要遵循某些套路來(lái)寫(xiě)代碼,例如上面這個(gè)例子,也許寫(xiě)Model、寫(xiě)View和寫(xiě)Action是三個(gè)不同的人來(lái)完成的時(shí)候,“如果遵循這一個(gè)Action會(huì)有一個(gè)Model來(lái)支持它”的這種套路來(lái)走的話,每個(gè)人都很容易找到代碼的下手點(diǎn),寫(xiě)View的人知道如何去聲明頁(yè)面為強(qiáng)類型(他會(huì)去找相關(guān)的Model),寫(xiě)Action的人知道return View(object model)中的model是啥,也知道用于處理Post的Action的參數(shù)是什么,寫(xiě)Model的人需要很了解業(yè)務(wù),知道哪些字段是必填的,那些字段有長(zhǎng)度限制等等,但是他也許不知道這個(gè)Model會(huì)被拿去怎么展示!

ASP.NET MVC中的Model是和業(yè)務(wù)緊密相關(guān)的,有什么樣的業(yè)務(wù)需求就會(huì)產(chǎn)生什么樣的Model,并且會(huì)有相應(yīng)的Action來(lái)出來(lái)它,有相應(yīng)的View來(lái)展示它。如果基于這個(gè)想法來(lái)開(kāi)發(fā)系統(tǒng)的話,很有可能得出這樣一個(gè)簡(jiǎn)要的開(kāi)發(fā)流程:研究業(yè)務(wù)-->轉(zhuǎn)化為對(duì)應(yīng)的Model,根據(jù)業(yè)務(wù)需求對(duì)Model的屬性配置驗(yàn)證特性-->設(shè)計(jì)數(shù)據(jù)庫(kù)表來(lái)對(duì)數(shù)據(jù)進(jìn)行存放(也許是xml也不一定)-->設(shè)計(jì)View來(lái)展示它,設(shè)計(jì)Action來(lái)處理它......。

原文鏈接:http://www.cnblogs.com/serafin/archive/2011/01/27/1945934.html

 

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2009-07-23 15:44:39

ASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC

2009-12-21 10:05:10

ASP.NET MVC

2010-04-09 09:28:37

View Model

2009-12-07 09:23:05

ASP.NET MVC

2009-06-15 10:57:51

FluentHtmlASP.NET MVC

2009-07-20 12:42:04

MvcContrib.ASP.NET MVC

2009-10-29 09:15:32

ASP.NET MVCDropDownLis

2009-01-16 13:17:16

AjaxASP.NET.NET

2010-10-20 09:05:16

ASP.NET MVC

2010-12-07 09:38:15

ASP.NET MVC

2011-04-14 09:19:22

ASP.NET MVC

2009-07-27 13:01:28

TreeViewASP.NET

2011-06-08 11:36:16

ASP.NETrender

2009-07-24 13:20:44

MVC框架ASP.NET

2009-07-31 12:43:59

ASP.NET MVC

2009-07-24 10:52:42

ASP.NET ISA

2009-07-22 16:11:43

ASP.NET AJA

2009-07-20 15:30:11

ASP.NET應(yīng)用

2009-03-06 10:28:30

MVCASP.NET異步Action
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)