Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 将Html.BeginForm()与自定义路由一起使用_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

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

Asp.net mvc 将Html.BeginForm()与自定义路由一起使用,asp.net-mvc,asp.net-mvc-3,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()方法,如下所示: @us

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

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/4/MyAction">
这将呈现以下表单标记:

<form method="post" action="/MyController/MyAction/4">
当我创建表单时,我希望它如下所示:

@using (Html.BeginForm("MyAction", "MyController", new { id = 4 }))
<form method="post" action="/MyController/4/MyAction">

但是,如果我像上面的例子那样使用BeginForm(),我将得到一个与默认路由匹配的url在为操作创建url时,是否有方法告诉BeginForm()使用我的自定义路由而不是默认路由?或者BeginForm()是否总是生成遵循默认路由模式的url


如果重要的话,我会使用asp.net mvc 3。

原因是路由系统选择第一条匹配的路由来构建路由。因此,为了避免这个问题,你可以重新安排你的路线,但这是相当脆弱的

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

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

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

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

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

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

global.asax:

routes.MapRoute("MyCustomRoute", "my-controller/{action}",
    new { controller = "MyController", action = "Index" });
[ActionName("my-action")]
public ActionResult MyAction()
{
}
@Html.BeginRouteForm("MyCustomRoute", new { action = "my-action" })
{
}
控制器(MyControllerController.cs):

routes.MapRoute("MyCustomRoute", "my-controller/{action}",
    new { controller = "MyController", action = "Index" });
[ActionName("my-action")]
public ActionResult MyAction()
{
}
@Html.BeginRouteForm("MyCustomRoute", new { action = "my-action" })
{
}
razor视图(my action.cshtml):

routes.MapRoute("MyCustomRoute", "my-controller/{action}",
    new { controller = "MyController", action = "Index" });
[ActionName("my-action")]
public ActionResult MyAction()
{
}
@Html.BeginRouteForm("MyCustomRoute", new { action = "my-action" })
{
}