2011-10-29 28 views
1

我在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的一部分的正確方法是什麼?

回答

1

我的理解是MVC框架將嘗試使用 參數在路由設置,並且只如果沒有找到,它會追加 他們之後?

您的理解不正確。 ASP.NET MVC不附加任何東西。它的客戶端瀏覽器發送所述表單提交如HTML specification定義:

FORM元素的方法,屬性指定HTTP方法中使用 到窗體發送到處理劑。該屬性可以取兩個 值:

  • 得到:隨着HTTP「獲取」的方法,該形式的數據集被附加到由動作屬性指定的URI(具有問號() 「?」作爲分隔符),並將這個新的URI發送給處理代理。
  • post:使用HTTP「post」方法,表單數據集包含在表單主體中併發送給處理代理。

ASP.NET MVC路由被用於解析輸入客戶端的HTTP請求,並將其重新調度到相應的控制器的動作。它們也被HTML幫助程序(如Html.ActionLinkHtml.BeginForm)用於生成正確的路由。這只是針對您需要提交用戶輸入值作爲url路徑的一部分(而不是查詢字符串)的特定場景,HTML規範沒有任何內容可以爲您提供。

所以,如果你想對抗HTML規範,你將不得不使用其他工具:javascript。所以你可以使用GET方法並訂閱表單的提交處理程序,並在其中操作url,以便在後面追加值。滿足你的要求。

不要認爲這是ASP.NET MVC和路由和東西。把它看作一個簡單的HTML頁面(當然這是瀏覽器所看到的),並開始從這一方面解決問題。你如何在一個簡單的HTML頁面實現這一目標?

+0

是的,這是有道理的。在我愚蠢的想法中,MVC會做類似於「分析請求 - 查找第一個匹配路由 - 嘿,''''之後的一個參數與缺少的可選參數同名,所以讓我們假裝它始終在那裏。 「現在想一想,即使MVC真的做到了,瀏覽器也不會知道也不會更新它的地址欄,除非有重定向。 – GSerg