网上关于ASP.NET MVC的系列教程有好几个,所以就不从头开始介绍了,结尾处给大家推荐了几个链接,需要的话可以从头系统的看看。
1、ASP.NET MVC介绍及与ASP.NET WebForm的区别
刚开始为了搞清楚ASP.NET MVC到底值不值得用,翻来覆去想了一个多礼拜,看了好多资料和评论,最后决定还是值得一用。MVC不是一个简单的设计模式,更像一种架构模式,或者一种思想,刚开始一听MVC想到的就是模板引擎,NVelocity,StringTempleate等,但感觉如果只是为了用模板这种独立的前台设计方式,没必要用ASP.NET MVC,大多数情况用Repeaterk控件和自定义控件儿就能做到,而且ASPX页面上本来就可以写c#代码,一些比较复杂的界面表现逻辑用普通的WebForm也能实现,其实ASP.NET MVC的VIEW部分默认用的还是aspx的解析器。ASP.NET MVC的View部分让你写一些大型的,布局复杂的网站更方便,更底层,更直接,很受对css,js很熟悉的开发者的欢迎。
当你理解了MVC的思想后,会发现ASP.NET MVC的好处真正在于Controller和Action,你写一段代码能很明确的知道是在处理什么请求,毕竟web程序处理的是一个一个的http请求,不像windows桌面程序,基于事件驱动更直观。ASP.NET MVC的Controller让你写一些web api或者rest风格的接口很方便(以前可能要用HttpHandler来做),这些Controller只负责提供数据(具体的ActionResult类,如JsonResult,JavascriptResult等)给使用者,比如一个Ajax调用,或者View层。
至于Model层,我看网上大多数人是用LINQ TO SQL实现的,毕竟使用起来很简单,设计好表,用LINQ 设计器往vs.net里一拖就能用了。而且本身就是强类型的,再在自动生成的代码上加一些分部方法,就可以实现数据的有效性验证等。还有就是对LINQ做的Model进行数据持久化和查询的时候更方便,直接用DbContext一个类,增删改查全能搞定。
有得就有舍,ASP.NET MVC虽然提供了先进的思想和一些便利,但ASP.NET以前的一些东西不能用了,比如以前自己写的一些服务器控件儿不能用了,WebPart,皮肤,各种数据绑定控件等都不能用了,但Master页还能用,Asp.net Ajax control toolkit(服务端)也不能用了,但asp.net ajax library(客户端js库)还能继续使用,基于页面和目录的授权不能用了(因为现在没页面,只有view了),但MemberShip和Forms身份验证还是支持的。标准WebForm的生命周期变了,好些事件没了,现在你可以写一些拦截器(Action拦截器、Result拦截器和Exception拦截器)来影响请求的处理过程,还有一些区别,总之失去的东西,都有变通的方法能找吧回来。
2、linq to sql如何获取插入语句产生的标识列的值?
其实很简单,把对象插入数据库后,直接取值就行了,如下BBSPost是一个实体类,其中PostID在数据库里是自增列。
复制代码 代码如下:
var db = new BBSDbContext(connstr);
BBSPost post = new BBSPost()
post.PostUser = User.Identity.Name;
post.PostTime = DateTime.Now;
db.BBSPosts.InsertOnSubmit(post);
db.SubmitChanges();
int postid = post.PostID; //这里就能取到标识列的值。
3、ASP.NET MVC里在请求提交后如何后维持滚动条位置?
在WebForm里再简单不过了,在web.config里配置MaintainScrollPositionOnPostBack=true就搞定了,但在MVC里就不行了。我们知道了原理后,可以自己实现,其实就是在提交表单或者滚动条滚动的事件里捕获当前滚动条的位置,把数值放在一个隐藏域里,提交给服务端,服务端应答后,从隐藏域里取出滚动条的位置,用js操纵滚动条滚动到上次的位置。
我们先在View里写一个隐藏域,如下
<%= Html.Hidden("scroll", ViewData["scrool"])%>
然后在处理客户端请求的action里给ViewData里存储一下提交上来的值(从FormCollection里取)。
复制代码 代码如下:
public ActionResult reply(BBSPost post, FormCollection coll) {
...
ViewData["scroll"] = coll["scroll"];
...
return View("show_post",posts);
}
这样页面提交后隐藏域里就会保存着提交前滚动条的位置,然后我们在用JQuery写一些逻辑实现最终的效果。
复制代码 代码如下:
<script type="text/javascript">
$(function() {
$(document).scroll(function() {
//在滚动条滚动的时候更新隐藏域里滚动条的位置值,经测试不支持IE8,汗
$("#scroll").val(document.documentElement.scrollTop);
});
$("form").submit(function() {
//在表单提交的时候更新隐藏域里滚动条的位置值
$("#scroll").val(document.documentElement.scrollTop);
return true;
});
//在document.load事件里取出隐藏域的值,并设置滚动条的位置
document.documentElement.scrollTop = $("#scroll").val();
});
</script>
4、验证用户输入
数据有效性的验证基本上哪个程序都躲不了,LINQ 和ASP.NET MVC的配合,让数据验证的实现也很方便。
LINQ TO SQL设计器自动生成的类是一个分部类,就是半块儿的类,你可以写一个分步类,在自动生成的类上加一些扩展的方法,如下我们在LINQ实体类BBSPost上加了一个GetRuleViolations方法,一个IsValid属性,其中GetRuleViolations方法验证给实体类赋的值的有效性,用yield关键字返回一个枚举器,这里可以写你自己的数据有效性验证逻辑。
IsValid属性内部调用GetRuleViolations方法,如果返回的枚举器的Count不是0的话,表示数据有效性验证不通过。
另外为了方式LINQ TO SQL往数据库里写入无效数据,我们给OnValidate分布方法加了两行代码,在数据有效性验证不通过的情况下写数据库之前抛出异常。
复制代码 代码如下: