我正在構建一個基本上具有相同模型的網站,區別在於視圖。如果用戶A登錄,他會看到視圖A.如果用戶B登錄,他會看到視圖B.這將是整個網站的大部分頁面。我看了一篇文章,說我利用了地區。但是由於我對這些頁面有相同的模型,我在考慮只使用一個控制器,控制器將決定加載哪個視圖。我想只使用一個aspx視圖,然後根據用戶加載ascx頁面。我不想在我的視圖中使用if語句來確定要呈現的ascx,執行此操作的最佳方法是什麼?MVC:在視圖中加載動態ascx
謝謝!
我正在構建一個基本上具有相同模型的網站,區別在於視圖。如果用戶A登錄,他會看到視圖A.如果用戶B登錄,他會看到視圖B.這將是整個網站的大部分頁面。我看了一篇文章,說我利用了地區。但是由於我對這些頁面有相同的模型,我在考慮只使用一個控制器,控制器將決定加載哪個視圖。我想只使用一個aspx視圖,然後根據用戶加載ascx頁面。我不想在我的視圖中使用if語句來確定要呈現的ascx,執行此操作的最佳方法是什麼?MVC:在視圖中加載動態ascx
謝謝!
我使用在視圖文件夾的子目錄中搜索的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;
}
}
在控制器中,您決定將炫耀其中ASCX視圖,並通過它無論是作爲一個視圖模型的ViewData
的或部分if (UserA)
{
ViewData["thePartialView"] = "NameOfPartialViewForUserA"
}
else
{
ViewData["thePartialView"] = "NameOfPartialViewForUserB"
}
在視圖>
Html.RenderPartial(ViewData["thePartialView"]);
感謝您的回覆。這是我的問題的解決方案,但我不知道它是否是最好的。
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,我在其中指定了母版頁的自定義路徑。