ASP.NET MVC 框架实践总结

  我公司开发团队采用asp.net mvc大致经过了三个阶段

  1、摸索期:从今年初公司开发一个新项目时选用了asp.net MVC Preview2,然后用了几天我发现routing似乎有bug,正在这时发现了已经出现了preview2-590,我赶紧将框架“升级”到了590。

  2、应用期:项目开发一个多月后我们发现了一些不方便不顺手的地方,感觉缺少一些提高效率的小功能,如当一个路径的参数经过routing路由到一个action后,action及视图页(.aspx/.ascx)上下文里获取它不符合我们的开发逻辑——在应用mvc之前我们都是用Request["id"]的方式获取,但是如果此时如果一个参数被routing"美化"后就得不到了,代码如下:

路由条目例

 

相应的控制器和action代码如下:

Code

 现在story方法体内以及story.aspx里Request["id"],Request["page"] 获取不到相应的值!由于开发项目时有些路由规则没有写,打算以后总体调整路由规则,但是出错了,因为根本获取不到参数,我们非常郁闷!

  于是我开始下载源码、检阅、跟踪、修改,经过一周左右的时间终于将MVC的流程及原理理了个顺,最后修改加进了一些我们急需的小功能:
修改了System.Web.Mvc的控制器、视图相关的代码,实现了在Action、.aspx/.ascx/.master里可以沿用Request["key"]的方式获取参数(不论routing怎么变都不影响),不区分key的大小
修改了ViewData类,使ViewData["key"]不区分大小写;

增加了一个路由配置类,使路由器可以能过.config文件来配置,如下:

routing配置文件

 给ViewData增加了一些扩展方法Get<T>(key)类方法,取得viewdata里的某个值,并且转换成指定的对象类型,如果不是该类型或如果是一个数组类型而元素为0个或没有此key都将返回null,代码如下:

ViewData.Get()

类完整代码如下:

ViewData.Get()

 

给controller增加一个类似.aspx里的Url.Action("story","space",{id=34})的方法Util.GetUrl():

Util.GetUrl()


 3、框架性能调优与重造,经过半年的应用开发、总结,发现MVC性能及routing不是很理想,于是又开始进行性能调优与修改,最后改成了现在的“版本”,详情请看下一篇性能调优。

 


一挥随笔(http://www.cnblogs.com/yihuiso),转载请留下此信息!

posted @ 2008-09-10 17:44 一挥 阅读(2799) 评论(18)  编辑 收藏 网摘 所属分类: 性能与缓存(cache)ASP.NET MVC

  回复  引用  查看    
#1楼2008-09-10 18:08 | Anders Liu      
Story方法不是有id参数了么?为什么还要Request["id"]?

如果说View里需要呈现id,那需要把id放在ViewData里传给View啊?

个人认为老兄你观念还没从WebForms转变到MVC上来。还有,貌似没有分清“Routing”和“URL Rewriting”之间的区别。Routing是对请求的路由,决定用哪个Action去处理一个请求;而URL重写只是Routing的一个副作用。

  回复  引用  查看    
#2楼2008-09-10 18:10 | zzticzh      
继续 辛苦了!
  回复  引用  查看    
#3楼2008-09-10 18:11 | zzticzh      
--引用--------------------------------------------------
Anders Liu: Story方法不是有id参数了么?为什么还要Request[&quot;id&quot;]?

如果说View里需要呈现id,那需要把id放在ViewData里传给View啊?

个人认为老兄你观念还没从WebForms转变到MVC上来。还有,貌似没有分清“Routing”和“URL Rewriting”之间的区别。Routing是对请求的路由,决定用哪个Action去处理一个请求;而URL重写只是Routing的一个副作用。
--------------------------------------------------------
精辟 佩服!

  回复  引用  查看    
#4楼2008-09-10 19:20 | Leven      
楼主的方式,实在是有误导初学者之嫌...而且还是使用的这么老的版本
建议认真学学mvc后再写吧.

  回复  引用  查看    
#5楼2008-09-10 20:38 | xjb      
还是预览不能lz就敢用在项目里,真佩服你的胆量。就算马上出正式版了,还要掂量掂量
  回复  引用  查看    
#6楼2008-09-10 21:00 | Q.Lee.lulu      
谢谢楼主分享!!
另楼主可以尝试用其他的视图引擎来写,例如NHaml、NVelocity来做模板,那样或许对你的MVC开发有点帮助。另外可以看下MvcContrib这个开源项目,或许对你有帮助!

  回复  引用  查看    
#7楼2008-09-10 22:18 | 重典      
挥哥写的文章顶一下,^^
  回复  引用  查看    
#8楼[楼主]2008-09-11 09:23 | 一挥      
--引用--------------------------------------------------
Q.Lee.lulu: 谢谢楼主分享!!
另楼主可以尝试用其他的视图引擎来写,例如NHaml、NVelocity来做模板,那样或许对你的MVC开发有点帮助。另外可以看下MvcContrib这个开源项目,或许对你有帮助!
--------------------------------------------------------
谢谢!请问你主要用asp.net mvc来开发什么应用呢?因为需要学习的东西太多了,我时间不是很充足,请分别介绍一下MvcContrib、NHaml有什么特点或主要应用价值?

  回复  引用  查看    
#9楼[楼主]2008-09-11 09:25 | 一挥      
--引用--------------------------------------------------
Leven: 楼主的方式,实在是有误导初学者之嫌...而且还是使用的这么老的版本
建议认真学学mvc后再写吧.
--------------------------------------------------------
谢谢批评,但是我请告诉我新的mvc preview3/preview4/previewn有些什么特别的改变或改进呢?你用哪个版本进行了什么应用的开发,是实际用的还是学习用?

  回复  引用  查看    
#10楼2008-09-11 09:27 | 紫色永恒      
都来了
  回复  引用  查看    
#11楼[楼主]2008-09-11 09:31 | 一挥      
--引用--------------------------------------------------
xjb: 还是预览不能lz就敢用在项目里,真佩服你的胆量。就算马上出正式版了,还要掂量掂量
--------------------------------------------------------
看来你是在工作开发项目的,你的顾虑是应该的。我们当初进行到第二阶段时就发觉是太草率了,也就是出现了一些文中提到的问题,但开发已经进行了一个半月,不可能推翻,因此进行了修改。
其实MVC开源的优势就在于他给了一个方式或一条新的开发路线,但是我认为要在实际项目中开发肯定要进行一些再开发或调整。因此我们没有追着升级到preview3 preiview4。。。
地球人都知道推翻以前的重新再来成本太高!

  回复  引用  查看    
#12楼[楼主]2008-09-11 09:33 | 一挥      
--引用--------------------------------------------------
Anders Liu: Story方法不是有id参数了么?为什么还要Request[&quot;id&quot;]?

如果说View里需要呈现id,那需要把id放在ViewData里传给View啊?

个人认为老兄你观念还没从WebForms转变到MVC上来。还有,貌似没有分清“Routing”和“URL Rewriting”之间的区别。Routing是对请求的路由,决定用哪个Action去处理一个请求;而URL重写只是Routing的一个副作用。
--------------------------------------------------------
Anders Liu教导得对!但是向后兼容可以在实际开发中的意义也非常重要!而且 视图层里Request[&quot;id&quot;]可以更灵活,修改调试更方便!
Routing是对请求的路由,这就是asp.net MVC框对传统方式最大的改变(改进!),route条目规则支持正则,但是不是很完全,它的首要作用是路由,但是如果能更好更灵活的写规则,美化输出路径岂不是更好?而且它的实现性能有些。。。所以我们对它进行了重写。

  回复  引用  查看    
#13楼2008-09-11 09:33 | Leem      
版本有点老了.
  回复  引用  查看    
#14楼2008-09-11 09:54 | Anders Liu      
@一挥
感谢你的虚心,我担心我有点言重了呢。

其实,从WebForms到MVC并不是一种“升级”,谈不上“向后兼容”。短期内Request["id"]可能会带来些方便,但考虑到今后的维护、换人后的继续开发,还是纯粹MVC一点好。

这是需要转变观念的,比如你试试给MVC做单元测试,还是ViewData好使一些。

  回复  引用  查看    
#15楼2008-09-11 09:58 | 有容乃大      
看来你们公司很牛啊。

-----------------------------------------------
发布.net项目开发工具(V3.0 ):
http://www.cnblogs.com/mrhgw/archive/2008/08/06/1261664.html" target="_new">http://www.cnblogs.com/mrhgw/archive/2008/08/06/1261664.html
http://www.mrhgw.cn" target="_new">http://www.mrhgw.cn

  回复  引用  查看    
#16楼2008-09-11 12:25 | Leven      
--引用--------------------------------------------------
一挥: --引用--------------------------------------------------
Leven: 楼主的方式,实在是有误导初学者之嫌...而且还是使用的这么老的版本
建议认真学学mvc后再写吧.
--------------------------------------------------------
谢谢批评,但是我请告诉我新的mvc preview3/preview4/previewn有些什么特别的改变或改进呢?你用哪个版本进行了什么应用的开发,是实际用的还是学习用?
--------------------------------------------------------
首先说明一点.既然楼主的项目用了p2.看样子项目不小.升级估计也麻烦.我也仅在此一提而已.主要是对楼主的几个修改不认同:
1."在应用mvc之前我们都是用Request["id"]的方式获取",mvc和routing的出现就是让我们从Request取值中解脱出来(p5中这一理念更为显然),楼主却反其道而行之.更改源码搞了这么个功能,所以我不赞同.
2."修改了ViewData类,使ViewData["key"]不区分大小写",个人认为完全多此一举.这是一个Dictionary对象.该对象的key本来就是区分大小写的.你这么一改,别人反而迷惑.
3.增加用配置文件配置route规则,这点赞同
4.新增扩展方法获取ViewData的数据.个人认为用处不大.可能在有的时候可以获得一定的便利.但是实现的代码我不大赞同,这样一来,既损失了效率,又让View中的代码更为隐晦,比如public static T Get<T>(this System.Web.Mvc.ViewData obj, string key),想必楼主是为了实现:
while((type t=ViewData.Get<type>("xxx") != null)
{
xxx t;
}
之类的代码.但是对于刚看到这部分代码的View开发人员不可避免的产生迷惑.为什么不直接
type tc=ViewData("xxx") as type;
foreach(var item in tc)
{
xxx item;
}
如此不是更加简单明了?至于你担心的VidaData中xxx为空的情况.根本无需考虑.这儿如果为空则会错误,只需要简单排错即可,楼主提供一个Has方法.我认为纯粹是降低执行效率.
5.给controller增加一个类似.aspx里的Url.Action("story","space",{id=34})的方法Util.GetUrl(),这个方法在特殊情况下是很不错.但是如果被滥用,将严重破坏整个mvc系统的构架.
ok.这一篇就说到这儿.等下去拜读下楼主另一篇.

  回复  引用  查看    
#17楼[楼主]2008-09-11 12:58 | 一挥      
----------------------------------------------------
如此不是更加简单明了?至于你担心的VidaData中xxx为空的情况.根本无需考虑.这儿如果为空则会错误,只需要简单排错即可,楼主提供一个Has方法.我认为纯粹是降低执行效率.
---------------------------------------------------
很有道理,采纳!

  回复  引用  查看    
#18楼2009-01-19 14:06 | leegool      
呵。小弟也用MVC beta做了个网站,并写了总结。
www.51xiangyin.com 在这里广告下。
总结地址在我博客主页就有。

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1288504




相关文章:

相关链接: