使用微软ASP.NET MVC Framework的一些感受 + 收集园子朋友发现的bug反馈 【补充】
原文章见:http://www.cnblogs.com/szw/archive/2007/12/18/1004344.html
这里总结一下许多园友提出的一些其他的bug和相关的一些意见、建议,以及对其中一些方案我的测试结果。
韩现龙: 楼主所言极是,不知是小弟才疏学浅还是MS MVC的问题,我在.cs页面无法引用.aspx页面上的runat="server"的控件。。这真让我郁闷又气愤!!
还有,Scott写的关于MVC的一篇文章上的关于对Detail这个方法的单元测试,我在本地却没有TestViewEngine这个对象。。。
--------------------------------------------------------
对应bug:原本的CodeFile被CodeBehide替代(且不管是不是有意,但目前好像没有官方说明故意这么做的好处是什么)。我我们都知道vs2005开始,webApplication 和 webSite 文件上的最大区别就是webApplication 的.aspx文件会多一个.designer.cs/.vb 文件(vs2003里面是另外一个文件,没记错的话好像是.resx吧),MVC里面少了这个文件,就不能在.aspx.cs调用.aspx控件,而在.aspx里面直接调用是可以的。
解决方案及说明:http://www.cnblogs.com/QLeelulu/archive/2007/12/12/992660.html


对应问题:
--引用--------------------------------------------------
五、觉得最头疼的一个问题,应为在MVC技术层面上似乎还不那么好解决:打开MVC的Global.asax,我们可以看大哦这样一句话:


更多说明见我原文章第五点。
解决方案及说明:
方案一:
--引用--------------------------------------------------
膘悍: 对于最后一个问题,我的解决方法是,把"[controller].mvc/[action]/[id]"表达式书写成"[controller]/[id]/[action].aspx"
我测试过,这样写没有问题,当然写成"[controller]/[action]/[id].aspx"也可以,只要最后是交给ASP.NET的ISAPI处理就行。
--------------------------------------------------------
测试结果:这种方法确实可行,但是这样一用,又暴露出了一个本来不是bug的bug(可以说是这种方案的一个bug或者使用注意点):
当我这样使用的时候,链接过去没有问题,格式是"[controller]/[action]/[id].aspx":

但是,如果我使用Html.ActionLink<T>范型方式之后,格式成了:"[controller]/[action]/.aspx/[id]",提示404错误(即找不到网页)。即使你改成了"[controller]/[action]/[id].aspx"格式在浏览器直接打开,还是会自动跳转到"[controller]/[action]/.aspx/[id]"格式,并报错。
个人猜想是RouteTable.Routes在执行或者重构的时候,总是会把最后一个参数(如上面的[id])加到末尾,而此时已经构成了"[controller]/[action]/.aspx"的格式,即使[controller]过程内部本身没有出错,但是RenderView出来的地址格式已经发生了变化(按最后合并成的格式),导致这样的情况(可能但不只可能是这种情况)。所以.mvc加在[controller]后面不会有问题,因为[id]本身就接在[action]后面。
看来如果用这种方法的时候,Html.action()和html.action<T>()在目前来说还不能完全通用。
方案二:
--引用--------------------------------------------------
膘汉: @SZW
呵呵,我也是看到有人说要在IIS6上添加mvc扩展名交给asp.net的isapi处理才想到的。
再修改一下,把html扩展名交给asp.net的isapi处理就可以写成下面这样了。
[controller]/[action]/[id].html
--------------------------------------------------------
测试结果:作为方案一的另一种选择(也是最理想的),这种方法在我这里,至少光修改一下.html,目前没有成功。

如果我使用Html.ActionLink<T>()的方法,是不会出错的,而当我使用Html.ActionLink()方法的时候,就提示这样的错误:


那么怎么样才能在Html.ActionLink()中使用onclick呢?发现很有意思的一件事,起初我发现只要把onclick改成OnClick就行了!但是正在打字这会我为了慎重起见又测试了一下,居然还是抱错!
貌似这个HTML.action<T>()和HTML.action()还真的有点不投缘啊……
PS:部分类似问题解决放案见: MVC Toolkit 部分已发现bug的根治方案 Part(1)
今天暂时先总结这么点,欢迎补充!
推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架