我在MVC 3中有一個小應用程序。
在這個微小的應用程序中,我希望我的URL非常清晰和一致。使路由參數實際出現在地址欄中
只有一個控制器帶有一個參數的動作。
如果未提供任何值(即,瀏覽器請求/
),則會顯示一個表單以收集該單個值。如果提供了值,則會呈現頁面。
的唯一途徑是這個:
routes.MapRoute(
"Default",
"{account}",
new { controller = "Main", action = "Index", account = UrlParameter.Optional }
);
這一切工作正常,但account
參數不會出現在地址欄中的URL的一部分。我可以手動鍵入test.com/some_account
,它會起作用,但除此之外,account
將作爲後置參數,因此不會顯示。如果我在表單中使用FormMethods.Get
,我會在網址後面追加?account=whatever
,這也不是我想要的,這與我的理解不符。我的理解是,MVC框架會嘗試使用路由中設置的參數,只有在找不到的情況下,它會將它們追加到?
之後。我嘗試了各種風格的設置路線 - 一個具有默認參數的路線,或一個具有所需參數的路線,或兩個路線(其中一個具有所需的參數,一個沒有參數);我嘗試過以各種方式混合HttpGet
/HttpPost
;我試過使用可選參數string account = null
的單動作方法,並使用兩個動作方法(一個帶有參數,一個沒有參數),但我根本無法讓這個東西出現在URL中。
我也諮詢了Steven Sanderson的MVC 3書,但截圖中也沒有任何參數(顯示皮划艇的詳細信息頁面,但地址欄中的URL是htpp://localhost:XXXX/
)。
那肯定工作和我想要做什麼的唯一事情是
return RedirectToAction("Index", new { account = "whatever" });
但爲了做到這一點,我得先檢查原始傳入的URL,如果它已經包含在account
不重定向它,否則它是一個無限循環。這似乎太奇怪和不必要。
使account
始終顯示爲URL的一部分的正確方法是什麼?
是的,這是有道理的。在我愚蠢的想法中,MVC會做類似於「分析請求 - 查找第一個匹配路由 - 嘿,''''之後的一個參數與缺少的可選參數同名,所以讓我們假裝它始終在那裏。 「現在想一想,即使MVC真的做到了,瀏覽器也不會知道也不會更新它的地址欄,除非有重定向。 – GSerg