我有一个具有基本功能的网站,但可以根据不同的客户和不同的合作伙伴进行覆盖。路由设置为处理客户端名称和伙伴名称作为路由的一部分:
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}。我需要覆盖它以传递客户端和伙伴,这两者都通过路由传递。
答案 0 :(得分:11)
如果需要,我可以将路径转换为虚拟Web路径 “〜\ UI \客户\伙伴\控制器\ View.cshtml”。
是的,这正是你应该做的,因为这是View
方法所期望的 - 一个到网站根目录的相对路径:
return View("~/UI/Client/Partner/Controller/View.cshtml", someViewModel);