【问题标题】:Using Html.BeginForm() with custom routes将 Html.BeginForm() 与自定义路由一起使用
【发布时间】:2012-01-08 15:42:30
【问题描述】:

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

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。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      这样做的原因是路由系统选择了第一个匹配的路由来构建路由。所以为了规避这个问题,你可以重新排列你的路线,但这很脆弱。

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

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

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

      【讨论】:

        【解决方案3】:

        如果您已经在 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" })
        {
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-02
          • 1970-01-01
          • 2017-01-03
          • 2018-11-14
          • 1970-01-01
          • 1970-01-01
          • 2015-08-16
          相关资源
          最近更新 更多