2011-06-13 178 views
0

我是新來的MVC,很抱歉,如果這是一個有點小白的問題:MVC 3路由問題

我設立在Global.asax的一些自定義路線。

routes.MapRoute(
    "Choose_your_dvd_Index", 
    "Choose-your-dvd", 
    new { controller = "DVD", action = "Index" } 
    ); 

routes.MapRoute(
    "Choose_your_dvd", 
    "Choose-your-dvd/{categoryName}", 
    new { controller = "DVD", action = "Category" } 
    ); 

具體來說,我映射「選擇 - 你-DVD/{類別名稱}」我的DVD控制器, 在那裏我有以下看法結果,以及具有默認的「選擇 - 你-DVD」頁。

public ViewResult Category(string categoryName) 
{ 
    var category = (db.Categories.Where(i => i.Name == categoryName).FirstOrDefault()) ?? null; 

    if (category != null) 
     return View(category); 

    return RedirectToRoute("Choose_your_dvd_Index"); 

    return View() ; 
} 

我想將用戶重定向到只是「選擇 - 你-DVD」如果他們進入一個無效的類別名稱? (即瀏覽器中的URL改變)

謝謝!

+0

好的,我已經完成了! 更改爲一個ActionResult,它工作! (失去了第二個「返回查看()」)! – mp3duck 2011-06-13 16:43:03

+0

你應該添加你自己的答案。 – 2011-06-13 16:44:52

回答

0

你的代碼沒有什麼問題,除了你應該使用ActionResult作爲返回類型而不是ViewResult這一事實,因爲當你重定向時沒有任何視圖被呈現。 RedirectToRoute方法返回RedirectToRouteResult,所以你的代碼將不能編譯。這就是爲什麼它總是把所有的控制器操作方法簽名返回的ActionResult這是基類的最佳實踐:

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

public ActionResult Category(string categoryName) 
{ 
    var category = (db.Categories.Where(i => i.Name == categoryName).FirstOrDefault()) ?? null; 
    if (category != null) 
    { 
     return View(category); 
    } 

    return RedirectToRoute("Choose_your_dvd_Index"); 
} 

假設你的路線看起來完全一樣,你在你的問題表明,如果例如/choose-your-dvd/foobar和用戶請求在您的數據庫中找不到foobar類別,他將被正確地重定向到同一控制器上的Index操作。

+0

感謝Darin:發現剛剛發佈的一個: 爲了幫助其他人,上面的代碼有點不對,因爲var類是一個bool,而不是一個類! – mp3duck 2011-06-14 06:54:43