使用_viewstart.cshtml和部分Razor视图的正确方法?


156

我正在使用_viewstart.cshtml自动为我的视图分配相同的Razor布局

这是我的Views文件夹根目录中的一个简单的死文件,如下所示:

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

这比将@Layout指令添加到每个单个视图要干得多。

但是,这给Razor 局部视图带来了问题,因为它们运行_viewstart.cshtml的内容,因此错误地为自己分配了布局,这使它们不再是局部的。

这是一个假设的项目,显示_viewstart.cshtml文件,共享的_layout.shtml文件和局部视图(“ AnonBar.cshtml”)。

示例项目结构

当前,我要解决的方法是在每个局部视图中添加以下行:

@{
    Layout = "";
}

在Razor中将视图表示为局部视图似乎是错误的方法。(请注意,与Web窗体视图引擎不同,部分视图的文件扩展名相同。)

我考虑过的其他选择却更糟:

  • 将所有部分视图放入一个公共文件夹,以便它们可以共享一个公共_viewstart.cshtml。这违反了视图与其控制器位于同一文件夹中的约定。
  • 不使用局部视图。

Razor视图引擎团队是否还在充实这些东西,还是我缺少一个基本概念?


3
对不起,很抱歉,但是文件名旁边的那些图标是什么?:)某种源代码控制对不对?
Alex

6
@jitbit:VisualSVN
2011年

Answers:


237

如果您是return PartialView()从您的控制器(而不是return View())那里来的,_viewstart.cshtml则将不会执行。


6
阿哈,对PartialViewResult班级一无所知。那就是我所需要的。
波特曼2010年

6
作为后续,我发现我需要显式将action方法的返回类型设置为,PartialViewResult而不是通常的ActionResult
波特曼

2
当操作方法的返回类型不是@Portman时,您是否遇到问题ActionResult?我很惊讶这是一个问题,因为在这种情况下MVC运行时的行为不会有任何不同(即,只要action方法返回的类型是ActionResult它的派生值,或者从它派生的任何类都可以正常工作)。
2010年

@marcind如果将返回类型设置为,则在w3wp.exe上会出现堆栈溢出ActionResult。如果返回类型为,则可以正常工作PartialViewResult。认为我需要提交Connect错误?
波特曼2010年

对我来说听起来很像-如果您提交Connect错误,请大声喊出来,将它投票。
Dav
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.