簡體   English   中英

MVC即時更改ViewName

[英]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;
}

發生的是,在這里我為MasterNameLayout設置了一個值,在兩個特定的控制器上,我需要將其設置為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM