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

我們先來(lái)看一個(gè)簡(jiǎn)單的場(chǎng)景,例如我們的blog系統(tǒng)有一個(gè)Post的對(duì)象,Post對(duì)象有一個(gè)Tags屬性和Categories屬性,他們的類型分別是:
- Post.Tags : StateList
(BlogEngine.NET 中的一個(gè)List 的擴(kuò)展類型) - Post.Categories : StateList
假如我們要在ASP.NET MVC中使用UpdataModel方法來(lái)對(duì)我們Post過(guò)來(lái)的Form表單數(shù)據(jù)更新到我們的Post對(duì)象中,可能會(huì)有如下的代碼:
- ///
- /// 將提交過(guò)來(lái)的新隨筆表單內(nèi)容保存到數(shù)據(jù)庫(kù)
- ///
- [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來(lái)更新Tags和Categories屬性的時(shí)候,是不可能成功的,因?yàn)閁pdateModel方法不知道怎樣將Form提交過(guò)來(lái)的"Tags"和"Categories"數(shù)據(jù)轉(zhuǎn)換為StateList
要實(shí)現(xiàn)一個(gè)ValueProvider,我們只需要實(shí)現(xiàn)IValueProvider接口的GetValue方法,并且返回一個(gè) ValueProviderResult的結(jié)果就可以了。下面我們就寫一個(gè)PostValueProvider來(lái)實(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
tagsList=newStateList (); - 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
list=newStateList (); - 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了:
- ///
- ///將提交過(guò)來(lái)的新隨筆表單內(nèi)容保存到數(shù)據(jù)庫(kù)
- ///
- [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方法。
本文標(biāo)題:ASP.NETMVC中使用UpdataModel方法
轉(zhuǎn)載來(lái)源:http://m.fisionsoft.com.cn/article/dhpeeie.html


咨詢
建站咨詢
