6

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

   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}。我需要覆盖它以传递客户端和合作伙伴,它们都通过路由传递。

4

1 回答 1

17

如果需要,我可以将路径转换为虚拟 Web 路径,例如“~\UI\Client\Partner\Controller\View.cshtml”。

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

return View("~/UI/Client/Partner/Controller/View.cshtml", someViewModel);
于 2013-08-28T14:44:46.413 回答