【问题标题】:Unexpected redirect url due to 2 similar routings由于 2 个类似的路由,出现了意外的重定向 url
【发布时间】:2014-11-30 13:19:56
【问题描述】:

我的应用程序使用多个路由。以下是两个相关的:

routes.MapRoute(name: "MyRoute",
                url: "Flow",
                defaults: new { controller = "MyCtrl1", action = "Index" });

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

现在我有一个返回的Action

return RedirectToAction("Index", "Flow", new {Id = <currId>});

现在框架可能做了它的优化("Default" 路由有一个默认的action 命名为"Index")并且重定向 url 我得到是:

https://<host>/Flow?Id=<currId>

虽然预期的网址是:

https://<host>/Flow/Index?Id=<currId>

我的问题是我希望"Default" 路由处理请求,而"MyRoute" 处理它。
看起来框架做了优化,忘记检查优化后预期的路线是否改变了。

我的问题:

  1. 您是否发现我的路线有问题?还是这是一个框架错误?
  2. 有没有办法阻止这些优化并返回Flow/Index

【问题讨论】:

    标签: asp.net asp.net-mvc routing routes asp.net-mvc-routing


    【解决方案1】:

    不要使用 return RedirectToAction(),而是使用 return RedirectToRoute()。您可以在 return RedirectToRoute("MyRoute") 中设置自定义路由名称。

    参考这个链接

    http://www.codeproject.com/Articles/641783/Customizing-Routes-in-ASP-NET-MVC

    http://www.dotnet-tricks.com/Tutorial/mvc/4XDc110313-return-View%28%29-vs-return-RedirectToAction%28%29-vs-return-Redirect%28%29-vs-return-RedirectToRoute%28%29.html

    【讨论】:

    • 但我想重定向到一个动作(而不是默认路由的动作)。如果我指定 return RedirectToRoute("Default") 我在哪里输入控制器\操作?附:即使它“有效”,这看起来也不优雅。我确信有更好的选择。
    【解决方案2】:

    受保护的内部 RedirectToRouteResult RedirectToAction( 字符串动作名称, 字符串控制器名称 )

    return RedirectToAction("Index", "MyCtrl2", new {Id = <currId>});
    
    return RedirectToAction("Index", "MyCtrl", new {id= <currId>});
    

    【讨论】:

    • 我想重定向到 Flow/Index 而不是默认的 MyCtrl1/Index。
    • routes.MapRoute(name: "MyRoute", url: "Flow/Index", 默认值: new { controller = "MyCtrl1", action = "Index" }); return RedirectToAction("Index", "MyCtrl1", new {Id = });试试这个。它可以工作。
    【解决方案3】:

    从您的默认路由中取出默认操作。这将强制它始终在创建的 URL 中指定:

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

    【讨论】:

    • 但我确实需要默认路由...否则这是一个简单的解决方案。顺便说一句,在尝试了很多事情之后,我了解到框架不会选择“最佳”,而是选择第一个合适的路由。现在我明白了很难定义一个“路由器比较器”——我正在寻找一种通过优化来避免创建 url 的方法。
    • 好的,没问题。如果您只需要主页的默认根目录,您可以为此添加一个根目录:routes.MapRoute(name: "Homepage", url: "", defaults: new { controller = "MyCtrl2", action = "Index" , id = UrlParameter.Optional });
    • 这不仅仅是我的主页。我有一个营销网站,它接收来自多个位置的请求,这就是为什么我需要一个默认操作来处理它们(每个 url 都有不同的参数..)。我丑陋的解决方案是将 Flow/Index 操作更改为 Flow/FlowIndex。这是处理这个特定问题的最简单(也是最丑陋)的方法。
    猜你喜欢
    • 2017-07-21
    • 1970-01-01
    • 2011-09-11
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    相关资源
    最近更新 更多