我有一个具有基本功能的网站,但可以根据不同的客户和不同的合作伙伴进行覆盖。路由设置为将客户端名称和合作伙伴名称作为路由的一部分处理:
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);
}
我收到以下错误,因为显然 return 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}。我需要覆盖它以传递客户端和合作伙伴,它们都通过路由传递。