在以下路径中找不到布局页面“〜/ Views / Shared /”

时间:2014-10-01 21:25:15

标签: c# asp.net-mvc

这是旧错误的新转折。我的许多页面使用布局页面,因此它们靠近顶部

@{
    Layout = "~/Views/Shared/" + ViewBag.layout;
}

在应用于控制器的动作过滤器中设置viewbag布局

namespace somenamespace.Controllers {
    [SessionSettings]
    public class MyController : Controller {

动作过滤器执行此操作

public class SessionSettings : ActionFilterAttribute {
    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        dynamic viewBag = filterContext.Controller.ViewBag;
        string layout = some database lookup
        if (layout == null) layout = "_defaultLayout.cshtml";
        viewBag.layout = layout

这在大多数时候效果很好。但是,当我检查事件日志 - 应用程序 - 我看到警告,事件ID 1309,事件代码3005,“发生了未处理的异常”“无法在以下路径找到布局页面”〜/ Views / Shared /“: “〜/查看/共享/"."

这是踢球者,通常事件发生在不使用布局的页面上,他们在顶部有这个

@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>...

有人对此有任何想法吗? THX

1 个答案:

答案 0 :(得分:1)

我在源代码中进行了跟踪,发现问题出在您设置Layout = "~/Views/Shared/" + ViewBag.layout;

设置此属性后,将调用方法WebPageExecutingBase.NormalizeLayoutPagePath(string path)

这基本上创建了一个绝对/相对路径,然后检查是否存在具有该名称的文件。由于ViewBag.layout为空,因此失败,因此出现错误(您可以在codeplex上查看此方法的来源,大约一半。

您稍后设置Layout = null并不重要,首先调用_ViewStart代码,以便发生错误。

我能看到的最佳选择是在设置之前检查ViewBag.layout是否为空:

if(ViewBag.layout != null)
{
    Layout = "~/Views/Shared/" + ViewBag.layout;
}

我认为通过这种方式,如果他们没有布局,您也不需要将其明确设置为null