我的网站结构非常典型,路径如下:
/home
/home/search
/categories
/categories/misc
我需要做的是在路径上放置一组动态前缀并将其映射到同一个地方,更重要的是,在整个站点中保留该前缀。前缀不会永远存在,但是当它出现时,需要保留它。
例如,我希望/client1/program1/home
映射到与/home
相同的控制器操作/视图,如果/home
上有Url.Content("~")
引用Url.Action("categories")
的链接或/client1/program1
,生成的URL需要保留请求的/client1/program1/categories
前缀,例如在后一种情况下:/client1/
。我需要在每个请求上保留该前缀,以维护该特定客户端/程序的自定义功能。我们通常使用子域和DNS来管理它,只留下路径,但是这个特定的客户端在多个域上运行时存在合规性问题。
/program1/
部分是静态的,可以在代码中设置,因为它们不经常更改,但VirtualPathProvider
部分是动态的,我需要在不部署新代码的情况下支持更改。
我一直在努力尝试使用URL重写,路由或自定义VirtualPathProvider的某些组合,但似乎无法使其工作。会话和cookie不够真实可靠,因为它们超时并且可以被清除。会有太多的地方需要更改以尝试在查询字符串上保持一致。
URL重写会在应用程序看到之前删除路径信息。它仍然需要访问以读取它应该显示的客户端和程序。
路由可以将请求发送到正确的控制器,但来自该页面的后续请求会忽略客户端/程序的任何内容。
自定义Url.Action()
感觉是最有希望的方向,但潜在的物理路径实际上并未发生变化。对于在站点根目录中运行的另一个目录中使用单独的应用程序似乎更有用。更改它并不只是改变所有路径和路径处理,它会改变引擎查找视图的能力。
有什么建议吗?
编辑:路由处理通过该引擎的路径,因此Url.Content()
之类的东西可以正常使用路由。我有其他从~
生成的网址,因此可能是我真正要问的问题:如何更改Url.Content()
映射到{{1}的内容}} 我认为这就是为什么我开始关注VirtualPathProvider
我现在非常确定不需要的东西。它更侧重于映射到本地物理文件路径。
答案 0 :(得分:0)
我不知道我是否遗漏了某些东西(因为这看起来微不足道),我在我的测试项目中试过这个并且它运行良好。
将此添加到您的路线配置。
routes.MapRoute("custom", "client1/{program1}/{controller}/{action}");
然后,您可以使用HttpContext.Request
对象查找program1
如果有效,请告诉我。