原文章见: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
- 关于"[controller].mvc/[action]/[id]”在IIS6下面的格式问题(.mvc)
// Note: Change Url= to Url="[controller].mvc/[action]/[id]" to enable
// automatic support on IIS6
对应问题:
--引用--------------------------------------------------
五、觉得最头疼的一个问题,应为在MVC技术层面上似乎还不那么好解决:打开MVC的Global.asax,我们可以看大哦这样一句话:// Note: Change Url= to Url="[controller].mvc/[action]/[id]" to enable--------------------------------------------------------
// automatic support on IIS6
更多说明见我原文章第五点。
解决方案及说明:
方案一:
--引用--------------------------------------------------
膘悍: 对于最后一个问题,我的解决方法是,把"[controller].mvc/[action]/[id]"表达式书写成"[controller]/[id]/[action].aspx"
我测试过,这样写没有问题,当然写成"[controller]/[action]/[id].aspx"也可以,只要最后是交给ASP.NET的ISAPI处理就行。
--------------------------------------------------------
测试结果:这种方法确实可行,但是这样一用,又暴露出了一个本来不是bug的bug(可以说是这种方案的一个bug或者使用注意点):
当我这样使用的时候,链接过去没有问题,格式是"[controller]/[action]/[id].aspx":
<%# Html.ActionLink("编辑",new{Action="PlateEdit" , ID=Eval("PlateID")}) %>
但是,如果我使用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,目前没有成功。
- 关于MVCToolkit的Html.ActionLink()我刚才又发现了一个有点不太合理的地方(别的控件可能也存在类似情况):当我输入htmlAttributes字段的时候,同样都输入下面的参数:
new { onclick= "alert('Hello TNT2!');"}
如果我使用Html.ActionLink<T>()的方法,是不会出错的,而当我使用Html.ActionLink()方法的时候,就提示这样的错误:
CS1502: The best overloaded method match for 'System.Web.Mvc.HtmlHelper.ActionLink(string, string, string)' has some invalid arguments
那么怎么样才能在Html.ActionLink()中使用onclick呢?发现很有意思的一件事,起初我发现只要把onclick改成OnClick就行了!但是正在打字这会我为了慎重起见又测试了一下,居然还是抱错!
貌似这个HTML.action<T>()和HTML.action()还真的有点不投缘啊……
PS:部分类似问题解决放案见: MVC Toolkit 部分已发现bug的根治方案 Part(1)
- 此外对于HTML.action的参数格式安排和对应注释(根源是前一个的问题),用的时候感觉非常乱,不知道用过的朋友感觉到了没有。比如第二个参数,明明提示是value(假设是value参数)的,你输完往后面输的时候,第二个已经不是value了,而是别的什么,你必去回过头去修改。除非你对他的格式了如指掌,并且想好了你要输那些,忽视掉他的注释一口气输完,那这样这注释似乎有点浪费感情了……况且大多数时候谁愿意去记那些东西,像Html.Select那么多情况下的那么多参数顺序……
今天暂时先总结这么点,欢迎补充!