通过路径名返回视图

时间:2013-08-28 14:27:16

标签: c# asp.net-mvc-3

我有一个具有基本功能的网站,但可以根据不同的客户和不同的合作伙伴进行覆盖。路由设置为处理客户端名称和伙伴名称作为路由的一部分:

   routes.MapRoute(
                "DefaultRoute", // Route name
                "{client}/{portal}/{controller}/{action}/{id}", // URL with parameters
                new { client="UNKNOWN", portal="UNKNOWN", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
                new string[] { "Enterprise.Portal.Controllers" }
            );

我有一个帮助器类来确定是否存在将取代普通视图的视图。该网站有不同的客户,每个客户都有不同的合作伙伴。如果这些客户端不需要默认视图,则可以提供HTML,并且合作伙伴也可以这样做。我将这些备用视图保存在一个文件夹中。辅助类获取信息,如果存在备用视图,则返回此视图的文件路径。如果返回null或空字符串,则使用普通视图。

public static string ViewPath(string basePath, string client, string partner, string controller, string viewname)
// This returns something like C:\Sites\Portal\UI\ClientName\PartnerName\ControllerName\View.cshtml

在我的控制器中,如果返回非null或空值,我该如何提供要使用的视图。这就是我所做的,哪些不起作用:

        if (String.IsNullOrEmpty(this.model.CurrentViewLocation))
        {
            return View(model);
        }
        else
        {
            return View(this.model.CurrentViewLocation, model);
        }

我收到以下错误,因为显然返回View()构造函数不能使用路径名,只能使用View名称。有没有办法实现这个目标?如果需要,我可以将路径转换为虚拟Web路径,如“〜\ UI \ Client \ Partner \ Controller \ View.cshtml”。

 Server Error in '/' Application

The view 'C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/Account/C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml.aspx
~/Views/Account/C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml.ascx
~/Views/Shared/C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml.aspx
~/Views/Shared/C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml.ascx
~/Views/Account/C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml.cshtml
~/Views/Account/C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml.vbhtml
~/Views/Shared/C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml.cshtml
~/Views/Shared/C:\Sites\Portal\UI\ClientName\PartnerName\Account\LogOn.cshtml.vbhtml

我猜测更好的方法是将Client文件夹和Partner文件夹添加到用于搜索视图的视图引擎的位置格式。但格式字符串仅包含控制器的{0}和视图名的{1}。我需要覆盖它以传递客户端和伙伴,这两者都通过路由传递。

1 个答案:

答案 0 :(得分:11)

  

如果需要,我可以将路径转换为虚拟Web路径   “〜\ UI \客户\伙伴\控制器\ View.cshtml”。

是的,这正是你应该做的,因为这是View方法所期望的 - 一个到网站根目录的相对路径:

return View("~/UI/Client/Partner/Controller/View.cshtml", someViewModel);