原文章見: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那麼多情況下的那麼多參數順序……
今天暫時先總結這麼點,歡迎補充!