Asp.net-Mvc

asp.net mvc 路由:如何使用預設操作但非預設參數?

  • April 4, 2018

我正在重寫這個問題,因為到目前為止的答案告訴我,我對它的定義還不夠好。我將在下面留下原始問題以供參考。

設置路由時,您可以為不同的 url/路由部分指定預設值。讓我們考慮 VS 嚮導生成的範例:

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

在此範例中,如果未指定控制器,則將使用 DefaultPageController,如果未指定操作,則將使用“索引”操作。網址通常看起來像:http://mysite/MyController/MyAction.

如果 Url 中沒有像這樣的操作:http://mysite/MyController那麼將使用 index 操作。

現在假設我的控制器 Index 和 AnotherAction 中有兩個動作。與它們對應的 url 分別是http://mysite/MyControllerhttp://mysite/MyController/AnotherAction。我的“索引”操作接受一個參數 id。因此,如果我需要將參數傳遞給我的 Index 操作,我可以這樣做http://mysite/MyController/Index/123:請注意,與 URL 不同http://mysite/MyController,我必須明確指定 Index 操作。我想要做的是能夠通過http://mysite/MyController/123而不是http://mysite/MyController/Index/123. 我不需要此 URL 中的“索引”我希望 mvc 引擎辨識,當我要求時http://mysite/MyController/123,123 不是一個動作(因為我沒有用這個名稱定義一個動作),而是我的預設動作的一個參數“指數”。我如何設置路由來實現這一點?

以下是問題的原始措辭。


我有一個控制器,其中定義了兩種方法

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

   [HttpPost]
   public ActionResult Index(SomeFormData data)
   {
       return View();

   }

這允許我http://website/Page在使用者導航到此 url (GET) 以及隨後回發表單 (POST) 時處理 Url。

現在,當我處理回帖時,在某些情況下,我想將瀏覽器重定向到這個 url:

http://website/Page/123

其中 123 是某個整數,我需要一種方法來在我的控制器中處理此 url。

如何設置路由,這樣可以嗎?目前我有嚮導生成的“預設”路由,如下所示:

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

我嘗試添加另一個控制器方法,如下所示:

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

但這不起作用,因為引發了模棱兩可的動作異常:

目前對控制器類型“PageController”的操作“Index”的請求在以下操作方法之間不明確: System.Web.Mvc.ActionResult Index() on type PageController System.Web.Mvc.ActionResult Index(Int32) on type PageController

我必須補充一點,我在這個控制器中還有其他操作。如果我不這樣做,這會奏效。

以下是解決此問題的方法:

您可以創建一個路由約束,以向路由引擎指示,如果您在 url 中有一些看起來像數字 (123) 的東西,那麼這是預設操作的操作參數,如果您有一些看起來不像的東西number (AnotherAction) 那麼它就是一個動作。

考慮這段程式碼:

routes.MapRoute(
 "MyController", "MyController/{productId}", 
 new {controller="My", action="Index"}, 
 new {productId = @"\d+" });

此路由定義將僅匹配 MyController in 之後的數值,http://mysite/MyController/123因此它不會干擾在同一控制器上呼叫另一個操作。

來源: 創建路由約束

引用自:https://stackoverflow.com/questions/5591569