ASP.NET MVC中使用UpdataModel方法
ASP.NET MVC Beta版中,在UpdataModel方法中提供了一個帶有IValueProvider參數(shù)的重載。那么這個IValueProvider有什么用呢?
我們先來看一個簡單的場景,例如我們的blog系統(tǒng)有一個Post的對象,Post對象有一個Tags屬性和Categories屬性,他們的類型分別是:
- Post.Tags : StateList<string> (BlogEngine.NET 中的一個List<T>的擴(kuò)展類型)
 - Post.Categories : StateList<Category>
 
假如我們要在ASP.NET MVC中使用UpdataModel方法來對我們Post過來的Form表單數(shù)據(jù)更新到我們的Post對象中,可能會有如下的代碼:
- /// <summary>
 - /// 將提交過來的新隨筆表單內(nèi)容保存到數(shù)據(jù)庫
 - /// </summary>
 - [AcceptVerbs("POST"), ActionName("NewPost")]
 - public ActionResult SaveNewPost(FormCollection form)
 - {
 - Post post = new Post();
 - try
 - {
 - UpdateModel(post, new[] { "Title", "Content", "Slug", "Tags", "Categories" });
 - }
 - catch
 - {
 - return View(post);
 - }
 - ..
 - }
 
很明顯,在上面的代碼中,我們使用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)上面我們提出的情況。代碼如下:
- PostValueProvider
 - publicclassPostValueProvider:IValueProvider
 - {
 - privateControllerContextcontext;
 - //privateDefaultValueProviderdProvider;
 - publicPostValueProvider(ControllerContextcontext)
 - {
 - this.context=context;
 - //dProvider=newDefaultValueProvider(context);
 - }
 - #regionIValueProvider成員
 - publicValueProviderResultGetValue(stringname)
 - {
 - if(string.IsNullOrEmpty(name))
 - {
 - thrownewArgumentException("參數(shù)不能為空","name");
 - }
 - switch(name)
 - {
 - case"Tags":
 - returnGetTagsValue();
 - case"Categories":
 - returnGetCategoriesValue();
 - default:
 - returnnewDefaultValueProvider(context).GetValue(name);
 - }
 - }
 - #endregion
 - privateValueProviderResultGetTagsValue()
 - {
 - stringstrTags=GetValueFromRequest("Tags");
 - if(string.IsNullOrEmpty(strTags))
 - {
 - returnnull;
 - }
 - string[]tags=strTags.Split(newstring[]{","},StringSplitOptions.
 
RemoveEmptyEntries);- StateList<string>tagsList=newStateList<string>();
 - foreach(stringtagintags)
 - {
 - tagsList.Add(tag.Trim().ToLowerInvariant());
 - }
 - returnnewValueProviderResult(tagsList,strTags,CultureInfo.
 
InvariantCulture);- }
 - privateValueProviderResultGetCategoriesValue()
 - {
 - stringstrCategories=GetValueFromRequest("Categories");
 - if(string.IsNullOrEmpty(strCategories))
 - {
 - returnnull;
 - }
 - string[]categories=strCategories.Split(newstring[]{","},
 
StringSplitOptions.RemoveEmptyEntries);- StateList<Category>list=newStateList<Category>();
 - foreach(stringcincategories)
 - {
 - list.Add(Category.GetCategory(newGuid(c)));
 - }
 - returnnewValueProviderResult(list,strCategories,CultureInfo.InvariantCulture);
 - }
 - privatestringGetValueFromRequest(stringname)
 - {
 - stringvalue=null;
 - HttpRequestBaserequest=context.HttpContext.Request;
 - if(request!=null)
 - {
 - if(request.QueryString!=null)
 - {
 - value=request.QueryString[name];
 - }
 - if(string.IsNullOrEmpty(value)&&(request.Form!=null))
 - {
 - value=request.Form[name];
 - }
 - }
 - returnvalue;
 - }
 - }
 
然后我們就可以在UpdateModel方法中使用我們的PostValueProvider了:
- ///<summary>
 - ///將提交過來的新隨筆表單內(nèi)容保存到數(shù)據(jù)庫
 - ///</summary>
 - [AcceptVerbs("POST"),ActionName("NewPost")]
 - publicActionResultSaveNewPost(FormCollectionform)
 - {
 - Postpost=newPost();
 - try
 - {
 - UpdateModel(post,new[]{"Title","Content","Slug","Tags","Categories"},
 
newPostValueProvider(ControllerContext));- }
 - catch
 - {
 - returnView(post);
 - }
 - ..
 - }
 
 以上介紹ASP.NET MVC中使用UpdataModel方法。
【編輯推薦】















 
 
 
 
 
 
 