通过路径名返回视图

ste*_*yer 5 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" }
            );
Run Code Online (Sandbox Code Playgroud)

我有一个帮助器类来确定是否存在将取代普通视图的视图.该网站有不同的客户,每个客户都有不同的合作伙伴.如果这些客户端不需要默认视图,则可以提供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
Run Code Online (Sandbox Code Playgroud)

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

        if (String.IsNullOrEmpty(this.model.CurrentViewLocation))
        {
            return View(model);
        }
        else
        {
            return View(this.model.CurrentViewLocation, model);
        }
Run Code Online (Sandbox Code Playgroud)

我收到以下错误,因为显然返回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
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*rov 13

如果需要,我可以将路径转换为虚拟Web路径,如"〜\ UI\Client\Partner\Controller\View.cshtml".

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

return View("~/UI/Client/Partner/Controller/View.cshtml", someViewModel);
Run Code Online (Sandbox Code Playgroud)