asp.net mvc 路由:如何使用預設操作但非預設參數?
我正在重寫這個問題,因為到目前為止的答案告訴我,我對它的定義還不夠好。我將在下面留下原始問題以供參考。
設置路由時,您可以為不同的 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/MyController和http://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因此它不會干擾在同一控制器上呼叫另一個操作。來源: 創建路由約束