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

ASP.NET MVC中使用UpdataModel方法

開發(fā) 后端
本文介紹ASP.NET MVC Beta版中,在UpdataModel方法中提供了一個帶有IValueProvider參數(shù)的重載。那么這個IValueProvider有什么用呢?

ASP.NET MVC Beta版中,在UpdataModel方法中提供了一個帶有IValueProvider參數(shù)的重載。那么這個IValueProvider有什么用呢?

我們先來看一個簡單的場景,例如我們的blog系統(tǒng)有一個Post的對象,Post對象有一個Tags屬性和Categories屬性,他們的類型分別是:

  1. Post.Tags : StateList<string> (BlogEngine.NET 中的一個List<T>的擴(kuò)展類型)  
  2. Post.Categories : StateList<Category> 


假如我們要在ASP.NET MVC中使用UpdataModel方法來對我們Post過來的Form表單數(shù)據(jù)更新到我們的Post對象中,可能會有如下的代碼:

  1. /// <summary> 
  2. /// 將提交過來的新隨筆表單內(nèi)容保存到數(shù)據(jù)庫  
  3. /// </summary> 
  4. [AcceptVerbs("POST"), ActionName("NewPost")]  
  5. public ActionResult SaveNewPost(FormCollection form)  
  6. {  
  7.     Post post = new Post();  
  8.     try  
  9.     {  
  10. UpdateModel(post, new[] { "Title", "Content", "Slug", "Tags", "Categories" });  
  11.     }  
  12.     catch  
  13.     {  
  14.         return View(post);  
  15.     }  
  16.     ..  
  17. }  

很明顯,在上面的代碼中,我們使用UpdateModel來更新Tags和Categories屬性的時候,是不可能成功的,因?yàn)閁pdateModel方法不知道怎樣將Form提交過來的"Tags"和"Categories"數(shù)據(jù)轉(zhuǎn)換為StateList<string>類型和 StateList<Category>類型。這時候就需要我們提供一個ValueProvider,來進(jìn)行這個轉(zhuǎn)換。

要實(shí)現(xiàn)一個ValueProvider,我們只需要實(shí)現(xiàn)IValueProvider接口的GetValue方法,并且返回一個 ValueProviderResult的結(jié)果就可以了。下面我們就寫一個PostValueProvider來實(shí)現(xiàn)上面我們提出的情況。代碼如下:

  1. PostValueProvider  
  2. publicclassPostValueProvider:IValueProvider  
  3. {  
  4. privateControllerContextcontext;  
  5. //privateDefaultValueProviderdProvider;  
  6.  
  7. publicPostValueProvider(ControllerContextcontext)  
  8. {  
  9. this.context=context;  
  10. //dProvider=newDefaultValueProvider(context);  
  11. }  
  12.  
  13. #regionIValueProvider成員  
  14.  
  15. publicValueProviderResultGetValue(stringname)  
  16. {  
  17. if(string.IsNullOrEmpty(name))  
  18. {  
  19. thrownewArgumentException("參數(shù)不能為空","name");  
  20. }  
  21. switch(name)  
  22. {  
  23. case"Tags":  
  24. returnGetTagsValue();  
  25. case"Categories":  
  26. returnGetCategoriesValue();  
  27. default:  
  28. returnnewDefaultValueProvider(context).GetValue(name);  
  29. }  
  30. }  
  31.  
  32. #endregion  
  33.  
  34. privateValueProviderResultGetTagsValue()  
  35. {  
  36. stringstrTags=GetValueFromRequest("Tags");  
  37. if(string.IsNullOrEmpty(strTags))  
  38. {  
  39. returnnull;  
  40. }  
  41.  
  42. string[]tags=strTags.Split(newstring[]{","},StringSplitOptions.
    RemoveEmptyEntries);  
  43. StateList<string>tagsList=newStateList<string>();  
  44. foreach(stringtagintags)  
  45. {  
  46. tagsList.Add(tag.Trim().ToLowerInvariant());  
  47. }  
  48.  
  49. returnnewValueProviderResult(tagsList,strTags,CultureInfo.
    InvariantCulture);  
  50. }  
  51.  
  52. privateValueProviderResultGetCategoriesValue()  
  53. {  
  54. stringstrCategories=GetValueFromRequest("Categories");  
  55. if(string.IsNullOrEmpty(strCategories))  
  56. {  
  57. returnnull;  
  58. }  
  59.  
  60. string[]categories=strCategories.Split(newstring[]{","},
    StringSplitOptions.RemoveEmptyEntries);  
  61. StateList<Category>list=newStateList<Category>();  
  62. foreach(stringcincategories)  
  63. {  
  64. list.Add(Category.GetCategory(newGuid(c)));  
  65. }  
  66.  
  67. returnnewValueProviderResult(list,strCategories,CultureInfo.InvariantCulture);  
  68. }  
  69.  
  70. privatestringGetValueFromRequest(stringname)  
  71. {  
  72. stringvalue=null;  
  73. HttpRequestBaserequest=context.HttpContext.Request;  
  74. if(request!=null)  
  75. {  
  76. if(request.QueryString!=null)  
  77. {  
  78. value=request.QueryString[name];  
  79. }  
  80. if(string.IsNullOrEmpty(value)&&(request.Form!=null))  
  81. {  
  82. value=request.Form[name];  
  83. }  
  84. }  
  85.  
  86. returnvalue;  
  87. }  

然后我們就可以在UpdateModel方法中使用我們的PostValueProvider了:

  1. ///<summary> 
  2. ///將提交過來的新隨筆表單內(nèi)容保存到數(shù)據(jù)庫  
  3. ///</summary> 
  4. [AcceptVerbs("POST"),ActionName("NewPost")]  
  5. publicActionResultSaveNewPost(FormCollectionform)  
  6. {  
  7. Postpost=newPost();  
  8. try  
  9. {  
  10. UpdateModel(post,new[]{"Title","Content","Slug","Tags","Categories"},
    newPostValueProvider(ControllerContext));  
  11. }  
  12. catch  
  13. {  
  14. returnView(post);  
  15. }  
  16.  
  17. ..  


 以上介紹ASP.NET MVC中使用UpdataModel方法。

【編輯推薦】

  1. 介紹ASP.NET 2.0虛擬主機(jī)
  2. 淺談ASP.NET應(yīng)用程序
  3. 優(yōu)化ASP.NET 2.0 Profile Provider
  4. 淺談ASP.NET管道優(yōu)化
  5. 介紹ASP.NET Routing引擎
責(zé)任編輯:佚名 來源: IT168
相關(guān)推薦

2014-06-30 15:10:32

2009-07-23 15:44:39

ASP.NET MVC

2009-07-22 09:11:02

Action方法ASP.NET MVC

2010-04-09 09:28:37

View Model

2010-11-02 08:46:55

NupackASP.NET MVC

2009-07-20 17:16:46

IIS中使用ASP.N

2009-07-22 15:02:02

ASP.NET MVC

2009-07-31 12:43:59

ASP.NET MVC

2021-06-22 16:59:56

微軟.NETC# 軟件開發(fā)

2009-07-20 16:45:41

使用StringBuiASP.NET

2009-07-24 13:20:44

MVC框架ASP.NET

2009-07-22 16:34:36

使用T4ASP.NET MVC

2010-11-18 08:46:27

ASP.NET MVC

2009-05-05 14:02:14

PlaceHolder控件ASP.NET

2009-07-22 10:09:59

ASP.NET MVC

2009-07-23 14:31:20

ASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC

2009-07-20 10:53:59

ASP.NET MVC

2009-09-10 09:50:47

ASP.NET MVC

2009-10-29 09:15:32

ASP.NET MVCDropDownLis
點(diǎn)贊
收藏

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