gpt4 book ai didi

c# - 在以下路径找不到布局页 "~/Views/Shared/"

转载 作者:行者123 更新时间:2023-11-30 17:46:28 25 4
gpt4 key购买 nike

这是对这个旧错误的新改写。我的许多页面都使用布局页面,因此它们将其放在顶部附近

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

viewbag 布局在应用到 Controller 的 Action 过滤器中设置

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

Action 过滤器在哪里做这件事

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/”无法在以下路径中找到: “~/Views/Shared/”。

这里是关键,通常事件发生在不使用布局的页面上,它们在顶部有这个

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

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

最佳答案

我追溯了源头,发现问题出在您设置 Layout = "~/Views/Shared/"+ ViewBag.layout;

设置此属性后,方法 WebPageExecutingBase.NormalizeLayoutPagePath(string path)被称为。

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

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

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

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

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

关于c# - 在以下路径找不到布局页 "~/Views/Shared/",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26150927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com