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

时间:2011-11-29 09:27:15

标签: 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
);

假设我使用这样的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? / p>

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

3 个答案:

答案 0 :(得分:41)

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

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

答案 1 :(得分:5)

原因是路由系统选择匹配的第一条路线来构建路由。因此,为了避免这个问题,您可以对路线进行重新排序,但这非常脆弱。

由于BeginForm方法没有增加太多价值,您可以使用HTML表单元素构建表单,并通过@ Url.RouteUrl()以某种方式构建操作

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

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

答案 2 :(得分:1)

如果您已在global.asax中定义了路由,则可以使用以下语法:

<强> global.asax中:

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

controller(MyControllerController.cs):

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

剃刀视图(my-action.cshtml):

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