2011-11-29 33 views
29

這是因爲你一定會知道的默認路由:使用Html.BeginForm()的定製路由

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

比方說,我這樣使用BeginForm()方法:

@using (Html.BeginForm("MyAction", "MyController", new { id = 4 })) 

這將呈現以下表單標籤:

<form method="post" action="/MyController/MyAction/4"> 

現在,讓我們說,我做了一個自定義路由:

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

當我創建一個表單我想它看起來就像這樣:

<form method="post" action="/MyController/4/MyAction"> 

但是,如果我用BeginForm()如上面的例子中,我將獲得相匹配的一個url改爲默認路線。 有沒有辦法告訴BeginForm()使用我的自定義路線,而不是默認的創建動作的url時?或者BeginForm()總是會產生遵循默認路由模式的url嗎?

我使用asp.net mvc 3,如果它很重要。

回答

36

您可以使用HtmlHelper類中的Html.BeginRouteForm()方法。

@Html.BeginRouteForm("MyCustomRoute", 
    new { controller = "MyController", action = "MyAction" }) 
4

原因是路由系統選擇了匹配的第一條路由來建立路由。所以爲了規避這個問題,你可以重新排序你的路線,但這是相當脆弱的。

由於BeginForm方法沒有增加多少價值,你可以使用HTML表單元素來構建你的表格,並建立通過@ Url.RouteUrl(動作)不知何故這樣

@Url.RouteUrl("MyCustomRoute", new { controller = "MyController", action = "MyAction" }) 

注意,我在這裏使用命名路線!

1

如果您已經定義在Global.asax的路線,你可以使用這個語法:

的Global.asax:

routes.MapRoute("MyCustomRoute", "my-controller/{action}", 
    new { controller = "MyController", action = "Index" }); 

控制器(MyControllerController.cs):

[ActionName("my-action")] 
public ActionResult MyAction() 
{ 
} 

剃刀視圖(my-action.cshtml):

@Html.BeginRouteForm("MyCustomRoute", new { action = "my-action" }) 
{ 
}