MVC RedirectToAction不隐藏参数

本文关键字:参数 隐藏 RedirectToAction MVC | 更新日期: 2023-09-27 18:02:57

我有以下动作

public ActionResult TemplateBuilder(int id, int? processId) { }

然后是下面的

@Url.Action("TemplateBuilder","InspectionTemplate")/id/processId

url看起来像:InspectionTemplate/TemplateBuilder/1/2

但是如果我使用
return RedirectToAction("TemplateBuilder","InspectionTemplate", new { id=1, processId = 2});

然后我得到以下结果:InspectionTemplate/TemplateBuilder/1?processId=2

我该如何解决这个问题。

这是我的路由

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "IDRoute",
            url: "{controller}/{action}/{id}",
            defaults: new
            {
                controller = "Login",
                action = "Index",
                id = UrlParameter.Optional
            }
        );
        routes.MapRoute(
            name: "ProcessRoute",
            url: "{controller}/{action}/{id}/{processId}",
            defaults: new
            {
                controller = "InspectionTemplate",
                action = "TemplateBuilder",
                id = UrlParameter.Optional,
                processId = UrlParameter.Optional
            }
        );
        routes.MapRoute(
            name: "DateRoute",
            url: "{controller}/{action}/{year}/{month}/{day}",
            defaults: new
            {
                controller = "Inspection",
                action = "Assign",
                year = UrlParameter.Optional,
                month = UrlParameter.Optional,
                day = UrlParameter.Optional
            }
        );

    }

MVC RedirectToAction不隐藏参数

你的路由定义有三个问题

  1. 只能在路由定义的最后一个参数上标记UrlParameter.Optional。如果您只提供一个,那么路由引擎无法知道应该绑定哪个参数因此值(s)将作为查询字符串参数添加)。
  2. 然而,主要问题是路由的顺序。路由
    引擎按照定义声明的顺序搜索定义一旦找到匹配的就会停止,在你的例子中
    IDRoute将匹配,因此需要交换路由。
  3. 然而,这可能会导致其他路由定义的问题,所以最好使您的路线唯一可识别,例如通过
  4. 在路由定义中指定控制器名。
你的定义应该是
public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapRoute(
        name: "ProcessRoute",
        url: "InspectionTemplate/{action}/{id}/{processId}",
        defaults: new { controller = "InspectionTemplate", action = "TemplateBuilder", processId = UrlParameter.Optional }
    );
    routes.MapRoute(
        name: "DateRoute",
        url: "Inspection/{action}/{year}/{month}/{day}",
        defaults: new { controller = "Inspection", action = "Assign", } // assumes all parameters are required
    );
    // The default will only be match if the url does not start with '/InspectionTemplate/' or '/Inspection/'
    routes.MapRoute(
        name: "IDRoute",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Login", action = "Index", id = UrlParameter.Optional }
    );
}