由正斜杠“/”分隔的ASP.NET MVC 4参数未正确传递args

时间:2016-06-03 22:34:47

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

我试图遵循许多使用多个正斜杠传递参数的网站使用的约定,而不是使用GET模型。

也就是说,我希望使用以下网址:

http://www.foo.bar/controller/action?arg1=a&arg2=b&arg3=c

以这种方式:

http://www.foo.bar/controller/action/a/b/c

我目前使用以下内容(大部分)工作:

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

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "Sandbox",
            url: "Sandbox/{action}/{*args}",
            defaults: new { controller = "Sandbox", action = "Index", args = UrlParameter.Optional }

        );
    }

但是,如果我传入类似

的内容
http://www.foo.bar/Sandbox/Index/a 

http://www.foo.bar/Sandbox/Index/a/

适当地调用控制器和操作:

public ActionResult Index(string args)
{
    return View();
}

但args为null。

但是,如果我传递的内容如下:

http://www.foo.bar.com/Sandbox/Index/a/b

然后根据需要,args是“a / b”。

我一直在搜索SO和网络的其余部分,但似乎无法找到解决方案。

我是否有一些明显的东西可以纠正这种行为?

我在寻找错误的术语吗?

注意:我能够使用Windows身份验证使用全新的ASP.NET应用程序重现此问题。所有这一切:

  1. 在VS 2015中创建ASP.NET应用程序
  2. 选择MVC
  3. 点击更改身份验证
  4. 选择Windows身份验证
  5. 将上述地图路线添加到RouteConfig.cs
  6. 创建SandboxController.cs并将args参数添加到Index
  7. 创建Index.cshtml视图
  8. 使用http://localhost:55383/Sandbox/Index/a
  9. 重新解决问题
  10. 使用http://localhost:55383/Sandbox/Index/a/b
  11. 重新调整预期行为

    非常感谢任何帮助。谢谢! 类似的问题,但对我没有帮助:URLs with slash in parameter?

1 个答案:

答案 0 :(得分:3)

没关系......这是问题......

MapRoute首先调用默认路由。 为了解决这个问题,我只是将默认地图路线与沙盒路线交换。

我希望这有助于某人。

工作解决方案:

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

        routes.MapRoute(
            name: "Sandbox",
            url: "Sandbox/{action}/{*args}",
            defaults: new { controller = "Sandbox", action = "Index", args = UrlParameter.Optional }

        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );


    }
}