2010-08-11 113 views
4

更新:MVC路線不工作

正如有人指出的,我在我的路線註冊缺少秒。現在我有第二個問題。

這是我想要的工作:

http://localhost/products/ - > ProductsController.Index()

http://localhost/products/3/apples - > ProductsController.Details(?INT ID,字符串產品名稱)

這是目前發生的事情:

http://localhost/products轉到我的詳細信息操作。

如何爲此設置路線?

我設置了以下路線在我Global.asx文件:

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

    routes.MapRoute(
     "ViewProduct", 
     "products/{id}/{productName}", 
     new { controller = "Products", action = "Details", id = 0, productName = "" } // Parameter defaults 
    ); 

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

我有以下控制器:

public class ProductsController : Controller 
{ 
    // 
    // GET: /Products/ 

    public ActionResult Index() 
    { 
     IList<Product> products = new List<Product> 
     { 
      new Product { Id = 57349, ProductName = "Apple" }, 
      new Product { Id = 57350, ProductName = "Banana" } 
     }; 

     return View(products); 
    } 

    public ActionResult Details(int? id, string productName) 
    { 
     Product p = new Product { Id = id.Value, ProductName = productName }; 

     return View(p); 
    } 
} 
+0

你使用哪個版本的iis? – 2010-08-11 19:41:51

+0

我沒有使用IIS。我正在使用內置的Visual Studio Web Server。 – Dismissile 2010-08-11 19:42:33

回答

2

因爲您已經爲idproductName定義了默認值,所以路由引擎在缺失時會爲您填充這些值,因此您對/ products的請求正在插入這些默認值並轉到詳細信息操作。

拿出:id = 0, productName = "",你會得到預期的行爲。

編輯

考慮在那裏具有{動作}參數。既然你有一個默認的動作,並且沒有辦法覆蓋它,你可能會把所有的東西都路由到細節。

+0

我是否也應該更改控制器操作,以便它是int而不是int? (可爲空)?這對我來說並不合適。 – Dismissile 2010-08-11 20:09:27

+0

如果int總是需要在那裏(似乎是這種情況),那麼我只是把它設爲一個不可爲空的int。可以幫助你以後發現錯誤。 – jwsample 2010-08-11 20:12:39

+0

是的,它應該永遠在那裏。只是跟着別人的榜樣。萬分感謝。 – Dismissile 2010-08-11 20:14:37

3

你在你的路線聲明

缺少一個 「S」

action =「細節s

或者在動作名稱中有一個超過「s」:

public ActionResult Detail s(int? ID,串產品名稱)

它是由你來決定糾正這一個;)

更新:對路由更新只需使用:

routes.MapRoute(
    "ViewProduct", 
    "products/{id}/{productName}", 
    new { 
     controller = "Products", 
     action = "Details" } 
); 

所以,當你鍵入/產品「默認「路線被使用。

+0

哦,很好。現在,當我點擊/產品時,它會將我帶入「詳細信息」操作,當我希望它執行索引操作時。我需要建立另一條路線嗎? – Dismissile 2010-08-11 19:46:32

+0

不...你只是說什麼是默認動作(Details),但是你可以通過在一個像http:// localhost/products/Index /' – 2010-08-11 19:51:55

+0

這樣的地址中傳遞它的名字來實現你想要的動作。但是我想/ products /默認到/產品/指標基本上。 – Dismissile 2010-08-11 19:56:07