基于 URL 参数的多个视图文件夹

Posted

技术标签:

【中文标题】基于 URL 参数的多个视图文件夹【英文标题】:Multiple View Folders Based on URL parameter 【发布时间】:2018-11-14 05:24:31 【问题描述】:

我为我们的一个客户开发了一个 MVC5 应用程序。它工作正常。现在我们有更多的客户端,所有的功能都是一样的,但是每个客户端的视图是不同的(不仅布局,而且每个视图的 html 结构本身都是不同的)。

我用来区分客户端的方法是提供不同的 url,添加一个客户端标识符(因为我们需要在登录之前识别客户端),并在 RouteConfig 中对其进行过滤,如下所示:

routes.MapRoute("ClientRoute", "client/controller/action/id",
            new  controller = "Home", action = "Index", id = 
UrlParameter.Optional ,
            new RouteValueDictionary 
             
                 "client", "icici|federal|pnb|sbi"   
            );

icici、federal、pnb 和 sbi 是有效客户端。

我可以使用下面的代码来区分任何客户端特定逻辑的客户端。

var clientName = HttpContext.Current.Request.RequestContext.RouteData.Values["client"].ToString();

我想要的是为每个客户提供单独的视图文件夹

视图(默认,如果在其他位置找不到,则应从此处获取) ICICI_Views SBI_Views FEDERAL_Views PNB_Views ....

这些文件夹将包含布局和 cshtml 文件。 任何具有 return View()return View("viewname") 的操作都应从受尊重的客户端文件夹中选择相应的视图。

如果有人知道实现此功能的任何解决方案(例如配置 RouteConfig 或 DisplayModeProvider 类等),请帮助我。我不想在每个返回视图语句中都进行 if-else 检查并指定完整路径。

提前致谢:)

【问题讨论】:

你调查过区域吗? 听起来你想要的是一个多租户系统。在这种情况下,我建议您创建自己的 VirtualPathProvider。其次,相信client 的值是正确的并且不会被用户更改,这确实是个坏主意。您的用户应该有一个客户端 ID,它应该确定一个视图,而不是任何人都可以在浏览器中更改的外部源。 @Shyju,我会调查区域,但是否可以仅在单独的区域中查看?我不认为。如果可能的话,如何配置何时返回哪个视图? @Erik Philips,我不清楚 VirtualPathProvider。会检查。谢谢 【参考方案1】:

你可以在action方法返回时指定视图的路径,例如如果客户端是ICICI那么return View("~/ICICI_Views/Home/Index.cshtml");如果没有发现客户可以使用 return View();

return View("~/ICICI_Views/Home/Index.cshtml");

【讨论】:

所以你建议每个方法手动确定哪个视图应该用于哪个客户端?

以上是关于基于 URL 参数的多个视图文件夹的主要内容,如果未能解决你的问题,请参考以下文章

Django / JS:通过url从.js文件传递参数到django视图[重复]

在 Django 中将文件路径作为 URL 参数传递

Django 2+ 中的多个可选 URL 参数

基于类的视图中的可选 url 参数

带有参数的 Django 反向 url 到基于类的视图

如何使基于类的视图接受来自 URL 的参数或在 URLconf 中硬编码