2014-11-15 65 views
3

可選id我有一個網站,只有這個路線:默認動作

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

    routes.MapRoute("Default", "{controller}/{action}/{id}", 
     new { controller = "Image", action = "Image", id = UrlParameter.Optional } 
     ); 
} 

這是控制器:

public class ImageController : Controller 
{ 
    public ActionResult Image(int? id) 
    { 
     if (id == null) 
     { 
      // Do something 
      return View(model); 
     } 
     else 
     { 
      // Do something else 
      return View(model); 
     } 
    } 
} 

現在,這是默認的動作,所以我可以訪問它沒有ID只需直接進入我的域名。爲了調用id,它可以正常工作,進入/ Image/Image/ID。然而,我想要的是沒有圖像/圖像(so/ID)調用。這現在不起作用。

這是默認路由的限制還是有辦法讓這個工作?

感謝

回答

3

創建特定於該URL的新路線:

routes.MapRoute(
    name: "Image Details", 
    url: "Image/{id}", 
    defaults: new { controller = "Image", action = "Image" }, 
    constraints: new { id = @"\d+" }); 

確保您註冊此人之前上述航線:

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 

否則將無法正常工作,因爲默認路由將優先。

這裏我說的是,如果url包含「/ Image/1」,那麼將執行ImageController/Image操作方法。

public ActionResult Image(int id) { //..... // }

約束意味着,如果{ID}參數必須是數字(基於正則表達式\d+),所以沒有必要可空INT,除非你確實需要一個可空INT,在大小寫刪除約束。

+1

並在現有的'controller/action/id'路線之前註冊此路線! – Eilon

+0

好點@Eilon路線排序很重要。 –

+0

建議用這個更新你的答案:) – Eilon