2010-06-07 43 views
0

我需要的路由很簡單,我必須在那裏丟失一些東西。作爲代碼示例,我提出了更簡單的情況,可以重現我的行爲。asp.net MVC中的入站/出站url路由

你有這樣的ActionMethod:

public ActionResult Index(string provider) 
{ 
    ViewData["Message"] = provider; 
    return View("Index"); 
} 

而且你有這樣的路線:

routes.MapRoute(
     null, 
     "{controller}/{action}/{provider}", 
     new { controller = "Home", action = "Index", provider = "Default" } 
); // Parameter defaults 

您可以撥打/首頁/索引/自定義和供應商將採取值 「自定義」

如果我想要url /?provider = Custom將供應商映射到t他參數。 我認爲這樣做會工作,因爲將使用默認控制器和默認操作,並且將使用來自查詢字符串的提供程序而不是默認操作程序。 但查詢字符串在這裏被忽略。

這是我的情況中的一個問題,因爲我有一個使用HTTP GET方法的表單。 表單動作必須是Html.BeginForm(c => c.Index(null)),它被解析爲/並且我的表單的值被添加到查詢字符串中。 (供應商是形式下拉)

因此,通過形式是/?ABC =值& CDE =值內置網址...

UPDATE

接受的答案如下(見註釋)使我這個解決方案:

​​

,並聲明的形式,像這樣:

Html.BeginRouteForm("Search", FormMethod.Get){ 
... 
} 

這樣,表單將與QueryString中的提供者一起工作(當我使用指定的路徑搜索時),但在其他情況下,我將使用默認路由。 :)

回答

2

當我設置供應商urlparameter.optional而不是靜態值,我得到的行爲,你正在尋找。我不認爲我可以完全解釋爲什麼這個工作,而有一個靜態默認值設置沒有,但試一試,看看它是否有幫助。如果有效,您可能還需要爲表單開發自定義路由,以便在路由中維護默認提供程序,而不是在控制器中進行自定義檢查。

routes.MapRoute(_ 
    "Default", _ 
    "{controller}/{action}/{provider}", _ 
    New With {.controller = "Home", .action = "Index", .provider = UrlParameter.Optional} _ 
) 

UPDATE:

而且,你不必在你的路由參數將它們傳遞給控制器​​的操作方法。例如,使用上面的路線,我能有這個URL

http://localhost:49705/home/about/default?otherValue=testme 

而這個控制器方法

Function About(ByVal provider As String, ByVal otherValue As String) As ActionResult 
    ViewData("Message") = provider & "|" & otherValue 
    Return View() 
End Function 

,輸出字符串默認| TESTME

此網址同上: http://localhost:49705/home/about/?provider=default&otherValue=testme

+0

是的你是對的,那是有效的,除了我真的需要一個默認值...我不想在每個使用它的動作中將回退代碼編寫到默認提供程序。 – 2010-06-07 15:58:48

+0

如果提供者被設置在URL中,爲什麼它需要成爲表單集合的一部分?意思是,如果我訪問site.com/home/about/customProvider並且表單從這裏執行GET操作,則GET URL將爲site.com/home/about/customProvider?form1=a&form2=b ...您會仍然有你的提供者正確? – Tommy 2010-06-07 16:07:30

+0

這是一個搜索頁面,您可以在表單中設置的不同提供商中搜索。但是我也需要從另一個頁面鏈接到正確的提供者的搜索。 – 2010-06-07 16:15:16

0

也許我不理解問題,但是如果您只是從您的路線中刪除{provider},或者使用默認的{id}改爲。然後,當您將URL設置爲/?provider=blah時,「blah」被分配給「provider」參數。

+0

是的,但然後我沒有得到我的提供商的默認值... 而我沒有得到好的網址,當我有我的網頁上的鏈接。如果我沒有使用GET進入該頁面的表單,那就沒問題了。但我需要路由(用於鏈接)和QueryString(用於表單) – 2010-06-07 16:01:45