将Html.BeginForm()与自定义路由一起使用

haa*_*gel 30 asp.net-mvc asp.net-mvc-3

这是你肯定知道的默认路线:

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

假设我使用BeginForm()方法,如下所示:

@using (Html.BeginForm("MyAction", "MyController", new { id = 4 }))
Run Code Online (Sandbox Code Playgroud)

这将呈现以下表单标记:

<form method="post" action="/MyController/MyAction/4">
Run Code Online (Sandbox Code Playgroud)

现在,假设我已经制定了自定义路线:

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

当我创建一个表单时,我希望它看起来像这样:

<form method="post" action="/MyController/4/MyAction">
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用上面示例中的BeginForm(),我将得到一个匹配默认路由的url.有没有办法告诉BeginForm()在创建动作的URL时使用我的自定义路由而不是默认路由?或者BeginForm()总是生成遵循默认路由模式的URL?

如果重要的话,我正在使用asp.net mvc 3.

Ale*_*kor 41

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

@Html.BeginRouteForm("MyCustomRoute", 
   new { controller = "MyController", action = "MyAction" })
Run Code Online (Sandbox Code Playgroud)


sai*_*ama 5

这样做的原因是路由系统会选择匹配的第一条路由来构建该路由。因此,要解决此问题,您可以重新排列路线,但这非常脆弱。

由于BeginForm方法不会增加太多价值,因此您可以使用HTML表单元素来构建表单并通过@ Url.RouteUrl()来构建操作,就像这样

@Url.RouteUrl("MyCustomRoute", new { controller = "MyController", action = "MyAction" })
Run Code Online (Sandbox Code Playgroud)

请注意,我在这里使用命名路由!