这是你肯定知道的默认路线:
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.
答案 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" })
{
}