ASP.Net MVC中错误视图的动态布局

时间:2011-04-11 06:38:23

标签: asp.net-mvc-3 razor

我有两个名为“a”和“b”的动作。我也有两种观点。这些观点的布局是不同的。 对于:

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

代表b:

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

也可以共享错误视图。

如何为Error视图使用动态布局。例如,当处理动作“a”时发生错误时,错误显示在动作“a”的布局中,如果在处理动作“b”时发生错误,则错误显示在动作“b”的布局中?

4 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

这次超载怎么样?

Controller.View Method (String, String) (System.Web.Mvc)

在行动中

  return View(viewName,"_X");

in b action

  return View(viewName,"_Y";

答案 2 :(得分:1)

希望这有助于你....在Asp.Net MVC中呈现布局的各种方式。

方法1:使用Views文件夹根目录中的_ViewStart文件控制布局渲染

我们可以使用以下代码在_ViewStart文件中更改布局的默认呈现:

@{
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;
}

方法2:从ActionResult返回布局

我们还可以通过使用以下代码从ActionResult返回布局来覆盖默认布局渲染:

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

方法3:在顶部的每个视图中定义布局

我们还可以通过使用以下代码在视图上定义布局来覆盖默认布局渲染:

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

感谢

答案 3 :(得分:0)

您可以尝试从控制器操作传递布局:在会话中设置当前布局,然后在错误控制器中检索它并通过ViewBag属性将其传递给视图:

public ActionResult A()
{
    // Do things

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

    return View();
}

ErrorController:

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

    return View();
}

然后在你的错误视图中:

@{
    Layout = ViewBag.ErrorLayout;
}

我会告诉你这不会赢得美容奖;可能还有其他方法。

例如,看一下如何在ActionFilter中设置布局的答案:How to set a Razor layout in MVC via an attribute filter?

您可以编写自己的继承自HandleError的错误过滤器,并在那里设置布局。