gpt4 book ai didi

c# - 如何将所有路由复制为伪装的子目录

转载 作者:太空宇宙 更新时间:2023-11-03 22:11:20 24 4
gpt4 key购买 nike

要创建网站的移动版本,我想重用我的 Controller 、一些 View 等,但创建看起来像移动版本的子目录。所以你可以有像这样的 URL:

       /Controller/Action/Id
/mobile/Controller/Action/Id
etc.

理想情况下,这些路由会映射到同一个 Controller ,然后我可以查看路由数据中的某处,看看该 URL 是否是移动的。我可以在 View 中使用 @Html.ActionLink() 等,默认情况下保留在移动版或桌面版上,而无需指定,但能够强制一个或另一个。

我可以通过在每条路线的前面设置一个可选参数来实现类似的效果,例如

routes.MapRoute(
"Default",
"{mobile}/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional, mobile = UrlParameter.Optional },
new { mobile = "mobile|" }
);

这会按预期工作:

Takes you to either / or /mobile version depending on where you are currently:
@Html.ActionLink("Current", "Index");

/ version
@Html.ActionLink("Desktop", "Index", new { mobile = "" });

/mobile version
@Html.ActionLink("Mobile", "Index", new { mobile = "mobile" });

然而,这似乎是一个非常蹩脚的解决方案,因为我真的不想将它添加到每条路线的前面。有没有什么好的方法可以更好地做到这一点,例如将可选的 /mobile 前缀添加到所有路由并使其正常工作?或者是否有一种完全不同的方法可以解决整个问题,这样更有意义?

希望这不是太含糊,任何建议将不胜感激。

最佳答案

对于传入请求很简单,您只需要两组路由,一组所有路由都以 mobile/ 开头。问题出在 URL 生成中,要解决它,您需要实现 IRouteConstraint。仅作用于 URL 生成并检查当前路由(当前 HTTP 请求的)是否以 mobile/ 开头,并将其与正在测试的路由进行比较。我在 MvcCodeRouting 中使用了类似的方法图书馆。

关于c# - 如何将所有路由复制为伪装的子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6519035/

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