gpt4 book ai didi

c# - 路线总是去第一个 maproute

转载 作者:太空狗 更新时间:2023-10-29 23:42:16 25 4
gpt4 key购买 nike

我正在尝试创建看起来有点像这样的 URI:http://hostname/mobile/en/controller/action 用于移动设备或 http://hostname/en/controller/action 用于桌面设备(非移动设备)。

我的路由表目前看起来像这样 (Global.asax.cs)

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
"Mobile", // Route name
"mobile/{language}/{controller}/{action}/{id}", // URL with parameters
new { language = "en", controller = "Route", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new { language = @"en|us" } // validation
);
routes.MapRoute(
"Default", // Route name
"{language}/{controller}/{action}/{id}", // URL with parameters
new { language = "en", controller = "Route", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new { language = @"en|us" } // validation
);

当我尝试做一个时出现问题return RedirectToAction("Add", "User");当我想让它转到 /en/User 时,它总是将桌面浏览器从 /en/User/List 重定向到 /mobile/en/User/Add/添加。移动版本工作正常,但我相信这是因为第一个“移动”路由总是被视为匹配的路由,即使它在开始时没有/mobile/也是如此。

我正在尝试对两个版本使用相同的 Controller,但一直坚持重定向到 Mobile 路由。这意味着 RedirectToRoute 并不完美,因为我想要动态路由。

感谢您的帮助。

最佳答案

主要问题是您提供的路线值与两条路线都匹配,这意味着它将采用第一条路线(移动路线)。

您可以通过重定向到路由而不是操作来手动选择要使用的路由。

return RedirectToRoute("Mobile", new {
language = "en", controller = "User", action = "Get", id = 20
});

手机或

return RedirectToRoute("Default", new {
language = "en", controller = "User", action = "Get", id = 20
});

为您的默认路线。

但是,这给您带来了一个新问题:获取当前路由的名称。如示例所示,引用命名路由 是很有可能的。 获取当前使用的路由的名称 然而似乎是不可能的。使用像查看当前 URI 这样的 hack 显然是不可取的。除了丑陋(黑客攻击)之外,它还可能导致大量代码重复。

然而,有可能向可以从您的 Controller (或 View )轻松获得的路由添加值:

routes.MapRoute(
"Mobile", // Route name
"mobile/{language}/{controller}/{action}/{id}", // URL with parameters
new { routeName = "Mobile", language = "en", controller = "Route", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new { language = @"en|us" } // validation
);
routes.MapRoute(
"Default", // Route name
"{language}/{controller}/{action}/{id}", // URL with parameters
new { routeName = "Default", language = "en", controller = "Route", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new { language = @"en|us" } // validation
);

现在从您的代码中,您可以使用路由本身提供的值重定向到当前路由:

return RedirectToRoute(RouteData.Values["routeName"], new {
language = "en", controller = "User", action = "Get", id = 20
});

现在如果你想让它变得完全花哨,你甚至可以用它做一个扩展方法:

public static class ControllerExtensions {
public static RedirectToRouteResult CustomRedirectToRoute(this Controller controller, string controllerName, string actionName, object routevalues) {
return CustomRedirectToRoute(controller, controllerName, actionName, new RouteValueDictionary(routevalues));
}

public static RedirectToRouteResult CustomRedirectToRoute(this Controller controller, string controllerName, string actionName, RouteValueDictionary routevalues) {
routevalues = routevalues ?? new RouteValueDictionary();
routevalues.Add("controller", controllerName);
routevalues.Add("action", actionName);
return new RedirectToRouteResult(controller.RouteData.Values["routeName"] as string, routevalues);
}
}

希望这能很好地解决您的问题!

关于c# - 路线总是去第一个 maproute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3100677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com