2011-04-11 31 views
2

我有兩個操作稱爲「a」和「b」。我也有兩種看法。這些觀點的佈局是不同的。 用於:ASP.Net中的錯誤視圖的動態佈局MVC

@{ 
    Layout = "~/Views/Shared/_X.cshtml"; 
} 

對於b:

@{ 
    Layout = "~/Views/Shared/_Y.cshtml"; 
} 

也錯誤視圖是共享的。

如何爲錯誤視圖使用動態佈局。例如,當處理動作「a」時出現錯誤,錯誤在動作佈局「a」中顯示,如果在處理動作「b」時出現錯誤,錯誤在動作佈局「b」中顯示?

+0

http://stackoverflow.com/questions/5059323/asp-mvc-3-use-different-layouts-in-different-views – Adam 2013-04-05 14:45:39

回答

0

你可以嘗試從控制器動作過關的佈局:在會話中設置當前佈局,然後在錯誤控制器讀取出來,然後把它傳遞給視圖通過ViewBag屬性:

public ActionResult A() 
{ 
    // Do things 

    // Set the layout 
    Session["currentLayout"] = "~/Views/Shared/_X.cshtml"; 

    return View(); 
} 

ErrorController :

@{ 
    Layout = ViewBag.ErrorLayout; 
} 

public ActionResult NotFound() // 404 
{ 
    // Set the layout 
    ViewBag.ErrorLayout = Session["currentLayout"]; 

    return View(); 
} 
在你的錯誤觀點

然後10

我會授予你這個不會贏得美容獎;可能還有其他方法。

例如,看看這個答案如何在一個ActionFilter設置佈局:How to set a Razor layout in MVC via an attribute filter?

你可以寫你自己的錯誤過濾器從HandleError繼承,並在那裏設置佈局。

6

你可以寫一個輔助方法:

public static string GetLayout(this HtmlHelper htmlHelper) 
{ 
    var action = htmlHelper.ViewContext.RouteData.GetRequiredString("action"); 
    if (string.Equals("a", action, StringComparison.OrdinalIgnoreCase)) 
    { 
     return "~/Views/Shared/_X.cshtml"; 
    } 
    else if (string.Equals("b", action, StringComparison.OrdinalIgnoreCase)) 
    { 
     return "~/Views/Shared/_Y.cshtml"; 
    } 
    return "~/Views/Shared/_Layout.cshtml"; 
} 

然後:

@{ 
    Layout = Html.GetLayout(); 
} 
+0

很好的解決方案。 +1。 – 2012-05-30 09:34:26

1

希望這種幫助ü....在Asp.Net MVC呈現佈局的各種方式。

方法1:

@{ 
var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString(); 

string layout = ""; 
if (controller == "Admin") 
{ 
layout = "~/Views/Shared/_AdminLayout.cshtml"; 
} 
else 
{ 
layout = "~/Views/Shared/_Layout.cshtml"; 
} 
Layout = layout; 
} 
:控制佈局呈現由瀏覽文件夾的根目錄下使用_ViewStart文件

我們可以在_ViewStart文件通過使用下面的代碼更改佈局的默認渲染

方法2:從ActionResult返回佈局

我們還可以通過使用以下代碼從ActionResult返回佈局來覆蓋默認佈局渲染:

public ActionResult Index() 
{ 
RegisterModel model = new RegisterModel(); 
//TO DO: 
return View("Index", "_AdminLayout", model); 
} 

方法3:

@{ 
Layout = "~/Views/Shared/_AdminLayout.cshtml"; 
} 

:與頂部

每個視圖我們也可以通過使用下面的代碼定義視圖上的佈局覆蓋默認佈局呈現定義佈局謝謝