ASP.NET MVC Preview3 bug 及期望 [集]

來源:互聯網
上載者:User

    ASP.NET MVC Preview3剛出來就發bug,不是想潑冷水,而是一貫的為了和大家一起更好地討論、學習、使用,大家一起進步。

    Pre3和Pre2的主要區別在Scott的Blog上面已經比較清楚地展示了,並且官方也提供了了一個升級文檔:http://weblogs.asp.net/scottgu/archive/2008/05/27/asp-net-mvc-preview-3-release.aspx。
   
    今天大概看了幾個關鍵的地方,目前發現了在ActionURL這個用法上面沒有太大變化的地方,但是在擷取上面反而有點小問題:

     一、比如當你試圖在AdminController(對應的View)裡面輸出Url.Action("Foo")的時候,理想情況下應該是返回/Admin[.mvc]/Foo,但是不幸的事情發生了,當你在HomeController裡面添加一個Foo的Action,並且在global.asax.cs裡面添加了一條Home/Foo的URL規則之後(不添加不會有問題),你再用Url.Action("Foo")的時候,返回的將有可能是這樣:/Home[.mvc]/Foo,所以為了保證持久的可用性,在這種情況下我們必須放棄Url.Action("Foo")這種方式,轉而使用這樣的重寫方法:Url.Action("Foo","Admin")。不光是Url.Action是這樣,Html.ActionLink也存在著同樣的問題。我反覆在IIS/VS以及routes.MapRoute/routes.Add方式進行了測試,結果都是一樣的。這點是很噁心的,不知道是我這裡環境的問題還是大家的測試結果也這樣?歡迎大家反饋!
   
此bug執行個體下載:http://files.cnblogs.com/szw/ASP.NET_MVC_Preview_3_-Routing_bug-1.rar
   
    關鍵測試代碼:
    Global.asax.cs:

            routes.MapRoute(
                "About",                                              // Route name
                "Home/About",                           // URL with parameters
                new { controller = "Home", action = "About" }  // Parameter defaults
            );

    /Views/Admin/Index.aspx:

    理想情況:Url.Action("About")應該和Url.Action("About","Admin")輸出一樣:<%= Url.Action("About","Admin") %><br />
    實際Url.Action("About")輸出:<%= Url.Action("About") %>

    輸出結果:

    另外在這裡總結一下之前2個Preview版本的已發現的bug(或者不足之處)的現狀:
    這些問題我依次發表在了使用微軟ASP.NET MVC Framework的一些感受 + 收集園子朋友發現的bug反饋 ,使用微軟ASP.NET MVC Framework的一些感受 + 收集園子朋友發現的bug反饋 【補充】 和MVC Toolkit 部分已發現bug的根治方案 Part(1)

    1、第一篇說到的一些問題,目前還是多多少少存在,但這並不能說明都是MVC本身的問題,有些是.NET3.5的一些特性——比如Linq to SQL——在使用和“配合”上的一些問題。
    2、第一篇、第二篇中提到的HtmlHelper中的很多擴充方法很亂的問題,這次在Preview3中是快刀斬亂麻,所有的size,maxLength之類的屬性都放到了htmlAttributs屬性中,倒也清爽,升級和使用的時候要多加註意了。
    3、第三篇MVC Toolkit 部分已發現bug的根治方案 Part(1) 中談到的問題在Preview3貌似已經完美解決了 。

    一些注意點:

官方的升級文檔上面有這麼一段話: 

·         dit the Default.aspx file and add the following line:

<% Response.Redirect("~/Home") %>

This redirect is not necessary for IIS 7. This is a workaround for an issue with how the Web server that is built into Visual Studio (the ASP.NET Development Server) works with routing.

    大概意思是說找到Default.aspx 並且加入這段代碼:<% Response.Redirect("~/Home") %> 。在IIS7中是不需要這麼做的,為的是當你用VS測試或者IIS7以下的IIS時候需要用這個來做一個根目錄的“跳板”。十分感謝Leven朋友的提醒,使用Preview1/2模板的話,那裡的default.aspx沒有設定Language="C#" ,預設是VB.NET,Response.Redirect("~/Home")的文法沒有錯誤,用了C#的話後面需要加一個“;”。這裡要補充一點文檔上沒有說清楚的:只是("~/Home") 的話對於IIS7以下的環境是無效的(當然在Preview3的模板中,在default.aspx.cs的Page_Load裡已經加入了這個跳轉,需要到default.aspx.cs中查看或修改。根據Page_Load和aspx頁面的執行順序,直接在aspx頁面設定將是無效的),從Preview1/2上面升級過來的時候還要注意這裡的"~/Home"需要和前面的版本修改global.asax.cs一樣,如果不是使用IIS7,則需要在後面加一個自訂的副檔名,比如.mvc——"~/Home.mvc"。

    還有一點點期望:
1、Html.DropDownList(原Html.Select)在資料來源的類型上可以更豐富一些,特別是直接接受IDictionary<string,object>類型的資料來源(目前由於IDictionary<string,object> htmlAttributes的重寫方法,這個類型會被認為是一個屬性的集合)。當然這在new SelectList()裡面還是可以做到的,只是這種“value-text”形式的Html輸入框能直接綁定key-value就更好了,目前還要自己擴充一些方法才能做到。
2、Preview3裡面一改以往必須在RenderView中輸入.aspx/.ascx檔案名稱的要求,可以根據Action名稱直接View();並且每個Action都要返回一個ResultAction類型,這時候,我們可以通過return RedirectToAction(actionName)來執行另外一個Action(RedirectToAction 返回的也是ResultAction類型),但是我又想到一個更加方便的方法(不知官方這麼用了沒有)——直接return actionName()——這個方法除了輸入方便,還助於在編譯時間檢測actionName的正確性,以及傳參的正確性及便捷性。因為傳回型別都是ResultAction。我嘗試了之後,發現是可行的,但是有一個跟View()方法有關的問題出現了:比如我在Action1中,return Action2();而在Action2中,我只是View(),沒有View("Action2"),這時候由於方法名稱還是Action1,所以在運行到Action2的View()的時候,會自動尋找Action1.aspx/ascx,而非Action2的。這裡有點遺憾,如果View()方法是可以再豐富一下,尋找其直接所屬的方法的名稱,那這個功能就更加完美了。

    更多的細節問題還在確認中,歡迎大家補充,我會一併總結上來!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.