Asp.net MVC: BindingHelperExtension的UpdateFrom如何使用?
2008-10-15 15:27
429 查看
预备知识:扩展方法(ExtensionMethod);Asp.netMVC
一般的做法
以修改一篇blog为例,当我们再输入框中输入了修改的内容之后,通过点击提交按钮将新的blog内容提交到服务器端,如图所示,我们可以修改blog的title,body和timestamp三项:图1
我们可能写出这样的代码:
[ControllerAction] publicvoidSave(intid) { BlogDataContextdbBlog=newBlogDataContext(); Postpost=dbBlog.Posts.Single(p=>p.ID==id);
post.Body=Request.Form["Body"]; post.Title=Request.Form["Title"]; post.Timestamp=DateTime.Parse(Request.Form["Timestamp"]); dbBlog.SubmitChanges(); RedirectToAction(new{action="Detail",id=post.ID}); }
图2
仔细看它里面存储的值,实际上就是我们在以前看到的Request.QueryString,只是现在我们不用在Url中显示地用?来写出,而是由Asp.netMVC框架帮我们生成,它会自动读取我们在form中定义的有些元素及其中所包含的内容。下面是一个form的例子,红色标注的地方可以先忽略:
图3
BindingHelperExtension.UpdateFrom让更新变得更加容易
回到更新blog内容的问题上来,下面的代码可以完成更新任务:post.Body=Request.Form["Body"];
post.Title=Request.Form["Title"];
post.Timestamp=DateTime.Parse(Request.Form["Timestamp"]);
但是这样一个属性一个属性地修改Model的值很繁琐,而且中间涉及到类型转换。比如上面的DateTime类型的属性Timestamp,严格的说我们应该在更新它的值之前坐类型判断,空值判断等等操作。当属性超过10个甚至更多时,更新属性的代码加上类型转换,错误处理等等,代码的数量就比较打了。那么有没有更加简便的做法呢?实际上在MvcToolkit.dll这个程序集中为我们提供了一个简化操作的类,它就是UrlHelper,是一个扩展方法,可以附加到任何的Object类型的对象上。
图4
添加对MvcToolkit.dll的引用,并引入名字空间
usingSystem.Web.Mvc.BindingHelpers;
[ControllerAction] publicvoidSave(intid) { BlogDataContextdbBlog=newBlogDataContext(); Postpost=dbBlog.Posts.Single(p=>p.ID==id);
post.UpdateFrom(Request.Form);
//post.Body=Request.Form["Body"];
//post.Title=Request.Form["Title"];
//post.Timestamp=DateTime.Parse(Request.Form["Timestamp"]);
dbBlog.SubmitChanges();
RedirectToAction(new{action="Detail",id=post.ID});
}
使用UpdateFrom的前提
UpdateFrom固然很好用,可是需要配合Form的Action来完成,而且它对于view中元素的定义有一定的要求。Url.Action
先来看看Action。我们为Form添加Action,注意method属性是post的,因为是提交给服务器。<formaction="<%=Url.Action(new{action="Save",id=ViewData.ID})%>"method="post">
这里action的语法有一点怪异,实际上它生成后的Url是这样的:
<formaction="/MVCStudy/Blog/Save/10"method="post">这里的Url实际上ViewPage的一个属性,而该属性又是UrlHelper的一个实例,所以这里的Url.Action实际上System.Web.Mvc.UrlHelper类的方法Action,该类存在于System.Web.Extension.dll程序集中。
图5
至于Url.Action方法生成Url的原理,可以参考Scott的文章“ASP.NETMVCFramework's
HtmlName——指定HtmlName,updatefrom才能生效。
这里的HtmlName是指在使用HtmlHelper类来生成html元素时所需要指定的相应的html元素的名字:图6
比如:
图7
这里虽然生成id和name两个属性,但是Asp.netMVC使用的"name[/u]"。生成这一元素的代码:
<pclass="body">注意这里的HtmlName一定要与对应的model的属性名一致[/u],否则无法完成更新。上述代码中注释掉的代码行就是这样一个例子。正确的HtmlName设定,请参考本文图3。
<%--<%=Html.TextArea("bodyOfBlog",ViewData.Body)%>--%>
<%=Html.TextArea("Body",ViewData.Body)%>
</p>
总结
使用UpdateFrom可以为我们带来很多便利,例如类型转换、空值检查之类,同时它也使得代码更加容易维护,因为在controller中不需要理会model的具体的属性,充分发挥了DataBanding的作用。让框架为我们做更多的事,那么我们就可以更省事。如果你的UpdateFrom不起作用,那么首先应该检查一下Form的action以及HtmlName的设定是否正确.
引用通告此日志的引用通告URL是:http://raderdotnet.spaces.live.com/blog/cns!3461738A506327E!542.trak引用此项的网络日志无
相关文章推荐
- Asp.net MVC: BindingHelperExtension的UpdateFrom如何使用?
- (asp.net MVC学习)System.Web.Mvc.HtmlHelper学习及使用
- ASP.net mvc开发中使用纯html如何创建FCKeditor编辑器的使用
- ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript 。
- 如何使用Apache log4net库与ASP.NET MVC 5日志记录
- ASP.NET MVC与Web From的使用时机?
- ASP.NET MVC:如何提供 Controller 继承体系使用的 ModelBinder?
- ASP.NET MVC Web API Post FromBody(Web API 如何正确 Post)
- 支持ASP.NET MVC、WebFroM的表单验证框架ValidationSuar使用介绍
- ASP.NET MVC中使用UpdatePanel的方法
- 如何在ASP.NET MVC和EF中使用AngularJS
- 【译】使用自定义ViewHelper来简化Asp.net MVC view的开发------part1
- 如何使用jQuery向asp.net Mvc传递复杂json数据
- 如何使用jQuery向asp.net Mvc传递复杂json数据-Filter篇
- ASP.NET MVC中如何使用PartialView
- 方法代码ASP.NET MVC如何使用Ajax的辅助方法
- 如何使用ASP.NET MVC的Filter
- 如何使用jQuery向asp.net Mvc传递复杂json数据
- [转]Asp.Net MVC使用HtmlHelper渲染,并传递FormCollection参数的陷阱
- 支持ASP.NET MVC、WebFroM的表单验证框架ValidationSuar使用介绍