2011-04-25 97 views
0

我正在構建一個基本上具有相同模型的網站,區別在於視圖。如果用戶A登錄,他會看到視圖A.如果用戶B登錄,他會看到視圖B.這將是整個網站的大部分頁面。我看了一篇文章,說我利用了地區。但是由於我對這些頁面有相同的模型,我在考慮只使用一個控制器,控制器將決定加載哪個視圖。我想只使用一個aspx視圖,然後根據用戶加載ascx頁面。我不想在我的視圖中使用if語句來確定要呈現的ascx,執行此操作的最佳方法是什麼?MVC:在視圖中加載動態ascx

謝謝!

回答

0

我使用在視圖文件夾的子目錄中搜索的ViewEngine。在這個例子中,UserA將從UserA目錄獲得視圖,如果它不存在,它將獲得普通視圖。

如果查看目錄的樣子:

Views 
|-> Home 
| |-> Index.cshtml 
| |-> UserA 
|  |-> Index.cshtml 
|-> Test 
    |-> Index.cshtml 

然後用戶A將得到瀏覽/首頁/用戶A/Index.cshtml的看法和其他人將獲得瀏覽/首頁/ Index.cshtml。包括UserA在內的每個人都將得到/Views/Test/Index.cshtml,因爲UserA沒有特定的一個。

public class MyViewEngine : WebFormViewEngine 
    { 
     public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) 
     { 
      ViewEngineResult result = null; 
      var request = controllerContext.HttpContext.Request; 

      if (UserA) 
      { 
       result = base.FindView(controllerContext, "UserA/" + viewName, masterName, useCache); 
      } 

      //Fall back to normal view if no other view has been selected 
      if (result == null || result.View == null) 
      { 
       result = base.FindView(controllerContext, viewName, masterName, useCache); 
      } 

      return result; 
     } 

     public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache) 
     { 
      ViewEngineResult result = null; 
      var request = controllerContext.HttpContext.Request; 

      if (UserA) 
      { 
       result = base.FindPartialView(controllerContext, "UserA/" + partialViewName, useCache); 
      } 

      //Fall back to normal view if no other view has been selected 
      if (result == null || result.View == null) 
      { 
       result = base.FindPartialView(controllerContext, partialViewName, useCache); 
      } 

      return result; 
     } 
    } 
0

在控制器中,您決定將炫耀其中ASCX視圖,並通過它無論是作爲一個視圖模型的ViewData

的或部分
if (UserA) 
{ 
    ViewData["thePartialView"] = "NameOfPartialViewForUserA" 
} 
else 
{ 
    ViewData["thePartialView"] = "NameOfPartialViewForUserB" 
} 

在視圖>

Html.RenderPartial(ViewData["thePartialView"]); 
0

感謝您的回覆。這是我的問題的解決方案,但我不知道它是否是最好的。

protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var action = filterContext.Result as ViewResult; 
     if (action != null) 
     { 
      action.MasterName = ViewData["siteConstants"].ToString(); 
     } 

     base.OnActionExecuted(filterContext); 
    } 

就是這樣的。我只是改變了action.MasterName行。在我的基本控制器中的Initialize方法中,根據用戶,我爲ViewData [「siteConstants」](這是母版頁的名稱)分配了一個值。我也使用了一個customViewEngine,我在其中指定了母版頁的自定義路徑。