MVC RedirectToAction不隐藏参数

时间:2016-08-17 12:26:58

标签: c# asp.net asp.net-mvc routing

我有以下行动

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

然后我有以下

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

然后,网址如下: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
            }
        );


    }

1 个答案:

答案 0 :(得分:1)

您的路线定义存在3个问题

  1. 只能标记路径定义中的最后一个参数 UrlParameter.Optional。如果你只提供一个,那么 路由引擎无法知道应该绑定哪个参数 所以值将作为查询字符串参数添加。)
  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 }
        );
    }