【发布时间】:2013-12-04 18:06:09
【问题描述】:
我在开发 MVC4 Intranet 应用程序时遇到错误,尝试使用多个页面布局。如我所见,使用 Internet 应用程序时不存在此问题,这里是快速演示。
使用 Razor 引擎创建新的 Internet 应用程序。将文件 _Layout.cshtml 复制到 Popup_Layout.cshtml(都在 ~/Views/Shared 中),并去除 Popup_Layout 中的页眉和页脚部分。在 ~/Controllers/HomeController.cs 中使用以下代码修改 Index 操作:
public ActionResult Index()
{
ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
string layout = "_Layout";
if (DateTime.Now.Ticks % 2 == 1)
{
layout = "Popup_Layout";
}
return View("Index", layout);
}
这创建了一个简单的游戏,它随机选择使用两种可用页面布局中的一种。编译和测试后,在浏览器中刷新我们可以看到有或没有页眉和页脚部分的起始页。
现在,如果我们重复完全相同的场景,唯一的区别是项目是 Intranet 应用程序 - 构建正常,但是在浏览器中刷新而不是获取没有页眉和页脚的页面,我们会收到服务器错误,堆栈跟踪的顶部说:
[InvalidOperationException: The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/Home/Index.aspx
~/Views/Home/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
~/Views/Home/Popup_Layout.master
~/Views/Shared/Popup_Layout.master
~/Views/Home/Popup_Layout.cshtml
~/Views/Home/Popup_Layout.vbhtml
~/Views/Shared/Popup_Layout.cshtml
~/Views/Shared/Popup_Layout.vbhtml]
System.Web.Mvc.ViewResult.FindView(ControllerContext context) +399386
作为替代方案,可以通过将 ~/Views/Shared/Popup_Layout.cshtml 分配给 Layout 属性在 View 本身中确定布局,但它也会引发错误。
我没有找到使用网络的解决方案,所以我希望有人可以在这里帮助我。谢谢
【问题讨论】:
-
你删除了
Index.chtml,但你仍然在View()返回中调用它。 -
"现在如果我们重复完全相同的场景,唯一的区别是项目是 Intranet 应用程序......" 你有两个单独的项目吗?
-
尝试删除 Popup_Layout.cshtml,然后为 Popup_Layout 创建一个新的空视图页面,而不是复制粘贴 _Layout.cshtml。在您拥有一个新的空视图页面后,复制粘贴内容(如果您愿意)。我不知道为什么,但我在我的测试项目中尝试过它并且它有效。我使用的是常规 Web 应用程序(不是 Intranet 应用程序),但遇到了与您描述的相同的缺少视图错误。
-
视图引擎不在寻找
index.cshtml,但它在寻找Popup_Layout.cshtml。对我来说听起来像是一个错误,或者 Razor View Engine 没有正确注册。尝试使用以下代码编辑 global.asax 文件:ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new RazorViewEngine()); -
@Jasen - 谁知道为什么,但似乎通过不同的创建改变视图解决了这个问题:-)
标签: c# asp.net-mvc-4 razor