[英]MVC Change ViewName on the fly
我有一個項目,希望向Desktop e Mobile用戶顯示不同的視圖,主要是為了獲得更好的體驗和速度。 現在我正在使用51degrees告訴我請求是來自移動用戶還是桌面用戶,然后在我的動作過濾器中,我將視圖名稱從“ Index”更改為“ Index.Mobile”,這就是我正在我根本不想使用布局的Views的一些問題。
這是我的方法:
public override void OnActionExecuted( ActionExecutedContext filterContext )
{
var result = filterContext.Result as ViewResult;
var view = filterContext.ActionDescriptor.ActionName;
//IsMobile is filled on my OnActionExecuting method
var IsMobile = filterContext.Controller.ViewBag.IsMobile;
if( result == null ) return;
string viewName;
string masterName;
if( IsMobile )
{
viewName = view + ".Mobile";
masterName = "_Layout.Mobile";
//Check if view exists
var viewResult = ViewEngines.Engines.FindView( filterContext.Controller.ControllerContext, viewName, null );
if( viewResult.View == null )
{
viewName = view;
}
}
else
{
viewName = view;
masterName = "_Layout";
}
result.ViewName = viewName;
result.MasterName = masterName;
}
發生的是,在這里我為MasterName或Layout設置了一個值,在兩個特定的控制器上,我需要將其設置為null,但仍會獲取之前設置的Layout 。
我需要的是,此方法將設置視圖和布局名稱,如果需要,我將在加載的視圖內將Layout設置為null。
能做到嗎?
編輯
我嘗試實現另一種方法Link ,但是我無法找到一種方法來更改Layout視圖,只能更改操作。
您可以在項目中創建一個文件夾,例如“ Areas / Mobile”,並將視圖,控制器甚至模型(用於移動設備的視圖模型)保存在其中。 您只需要創建一個路由規則,即可將來自移動設備的請求傳遞到“區域/移動”內部的控制器。 管理和構建網站的移動版本會容易得多。
經過一些調試后,我發現在View
內部設置該值無效,因為ViewEngine
會忽略此新值,並保留在OnActionExecuted
方法上設置的值。
我設法使用相同的方法解決了問題,但是添加了一個ViewBag來告訴我該特定視圖是否需要Layout。 由於OnActionExecuted
將在后執行Controller
和前View
有可能設置的值作為真/在虛假Controller
,然后讀取它里面OnActionExecuted
。
這是工作示例:
public override void OnActionExecuted( ActionExecutedContext filterContext )
{
var result = filterContext.Result as ViewResult;
var IsMobile = filterContext.Controller.ViewBag.IsMobile;
var view = filterContext.ActionDescriptor.ActionName;
if( result == null ) return;
string viewName;
string masterName;
bool hasLayout = filterContext.Controller.ViewBag.HasLayout ?? true;
if( IsMobile )
{
viewName = view + ".Mobile";
masterName = hasLayout ? "_Layout.Mobile" : null;
//Check if new view exists
var viewResult = ViewEngines.Engines.FindView( filterContext.Controller.ControllerContext, viewName, null );
if( viewResult.View == null )
{
viewName = view;
}
}
else
{
viewName = view;
masterName = hasLayout ? "_Layout" : null;
}
result.ViewName = viewName;
result.MasterName = masterName;
}
如果除此以外還有其他更好的選擇,請解決此問題,但感覺有點不對勁。
動態更改視圖名稱也可以使用它,這很簡單
public void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.HttpContext.Request.IsLocal)
{
filterContext.Result = new ViewResult { ViewName = "Index" };
}
}
這對我有用:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.