ASP.NET MVC Beta版中,在UpdataModel方法中提供了一个带有IValueProvider参数的重载。那么这个IValueProvider有什么用呢?

我们先来看一个简单的场景,例如我们的blog系统有一个Post的对象,Post对象有一个Tags属性和Categories属性,他们的类型分别是:
- Post.Tags : StateList
 (BlogEngine.NET 中的一个List 的扩展类型) - Post.Categories : StateList
 
假如我们要在ASP.NET MVC中使用UpdataModel方法来对我们Post过来的Form表单数据更新到我们的Post对象中,可能会有如下的代码:
- ///
 - /// 将提交过来的新随笔表单内容保存到数据库
 - ///
 - [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属性的时候,是不可能成功的,因为UpdateModel方法不知道怎样将Form提交过来的"Tags"和"Categories"数据转换为StateList
要实现一个ValueProvider,我们只需要实现IValueProvider接口的GetValue方法,并且返回一个 ValueProviderResult的结果就可以了。下面我们就写一个PostValueProvider来实现上面我们提出的情况。代码如下:
- PostValueProvider
 - publicclassPostValueProvider:IValueProvider
 - {
 - privateControllerContextcontext;
 - //privateDefaultValueProviderdProvider;
 - publicPostValueProvider(ControllerContextcontext)
 - {
 - this.context=context;
 - //dProvider=newDefaultValueProvider(context);
 - }
 - #regionIValueProvider成员
 - publicValueProviderResultGetValue(stringname)
 - {
 - if(string.IsNullOrEmpty(name))
 - {
 - thrownewArgumentException("参数不能为空","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了:
- ///
 - ///将提交过来的新随笔表单内容保存到数据库
 - ///
 - [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方法。
                网站名称:ASP.NETMVC中使用UpdataModel方法
                
                文章起源:http://www.csdahua.cn/qtweb/news30/431880.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网