2013-08-28 61 views
2

我有一個具有基本功能的網站,但可以根據不同的客戶和不同的合作伙伴進行重寫。路由設置來處理客戶端的名稱和合作夥伴名稱作爲路線的一部分:通過路徑名返回視圖

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); 
     } 

我收到以下錯誤,因爲很明顯,返回查看()構造函數不能使用的路徑名,僅視圖名稱。有沒有辦法做到這一點?如果需要,像「〜\ UI \ Client \ Partner \ Controller \ View.cshtml」,我可以將路徑轉換爲虛擬Web路徑。

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 

我猜一個更好的方式做這將是客戶端文件夾和合作夥伴文件夾添加到其是用於搜索的視圖的視圖引擎的位置格式。但格式字符串只包含控制器的{0}和視圖名稱的{1}。我需要覆蓋它來傳遞客戶端和合作夥伴,這些都是通過路由傳遞的。

回答

9

如果需要,我可以將路徑轉換爲虛擬Web路徑,如 「〜\ UI \ Client \ Partner \ Controller \ View.cshtml」。

是的,這正是你應該做的,因爲這是View方法所期待的 - 到網站根目錄的相對路徑:

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

的工作,我只是需要之前轉換爲虛擬路徑傳遞給View構造函數。這很簡單。有時候我只是覺得啞巴。 – stephenbayer