2012-02-06 63 views
0

我不知道爲什麼我有這樣的問題,ASP.NET MVC路由。我希望有一個工具可以顯示我目前設置的路線。無論如何,不正確的路由是ASP.NET MVC

在我的global.asax.cs文件我有以下幾點:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

    routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
); 
} 

,我有以下的HomeController.cs

public ActionResult Register() 
{ 
    return View(); 
} 

我期待能夠訪問定義這個頁面在我的瀏覽器中訪問/帳戶/註冊。但是,我仍然得到了404.我做錯了什麼?

+0

http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx – SLaks 2012-02-06 23:48:09

回答

1

更換

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

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

這將意味着/account/register意志路線在主控制器上註冊操作。這也意味着您通過@Html.ActionLink("Register", "Register", "Home")生成的操作鏈接和其他鏈接將生成網址/account/register

將「具有參數的URL」想象爲該URL將與之匹配的模式。

與你原來的路線圖的問題是,它是在尋找這樣/account/controllername/actionname的URL。所以,當你去/account/register - 它正在register作爲控制器名稱,並採取默認的動作名稱(在這種情況下,寄存器) - 並作爲「註冊」操作不會在「註冊」控制器存在 - 你得到一個404.

已更新 根據Robert的評論,我更新了我的建議路線。

這也是值得注意的是,羅伯特指出,這整個事情可以由通過製作「帳戶」控制器,以及移動「註冊」的行動有更簡單。然後你可以刪除'SignUp'路由,並使用默認路由。如果你仔細想過,你會同意這是一個比'Home'控制器更好的'Register'操作。

+0

實際使用'帳戶/ register'他們應該刪除默認動作值,否則報名將是從'帳戶訪問'只。生成的URL永遠不會在其中包含* register *這個詞。如果你手動編寫URL,它當然也可以工作。 – 2012-02-07 02:20:19

+0

順便說一句:我也建議(並且可能不是這樣)避免在'HomeController'中進行帳戶操作。在別處有它會更好。 'AccountController'也許?那麼在這種情況下,默認路由仍然適用,因爲控制器的名字是* account * ...這意味着OP很可能會過度複雜化它們的路由而沒有明顯的好處。他們應該寧願保持默認路由和單獨的控制器... – 2012-02-07 02:21:40

3

/Account/Register你的第一個路由匹配。

單詞Register{controller}相匹配,因此它尋找名爲RegisterController的控制器。