无布局的剃刀视图


80

Layout = null;在我看来,它怎么仍会保留默认布局呢?

有什么技巧可以阻止它这样做吗?

这是我没有布局的看法:

@{
    Layout = "";
}

<!DOCTYPE html>

<html>
<head>
    <title>Index</title>
    @{Html.RenderAction("Head", "Header");}
</head>
<body>
    <div>
        Home
    </div>
</body>
</html>

这是渲染的输出!!

<!DOCTYPE html>

<html>
<head>
    <title>Index</title>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <link href="/Content/Site.css" rel="stylesheet" type="text/css" />
    <script src="/Scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
    <script src="/Scripts/modernizr-1.7.min.js" type="text/javascript"></script>
</head>

<body>
    header
</body>
</html>
</head>
<body>
    <div>
        Home
    </div>
</body>
</html>

null在呈现的页面中看到单词了吗?
SLaks 2011年

您在哪里设置默认布局?
Slaks 2011年

您在此目录中是否有_viewstart.cshtml?我在尝试使用_viewstart时遇到了同样的问题。然后,我将其重命名为_mydefaultview,将其移至views / shared目录,并切换为在不需要的cshtml文件中不指定任何视图,并为其余部分指定_mydefaultview。不知道为什么这是必要的,但是它起作用了。
DMulligan 2011年

请设置为答案,我将其标记为正确。这肯定是剃须刀中的错误吗?

我不确定这是否是错误,_viewstarts是否打算不被覆盖,或者我们做错了什么。我也想知道。
DMulligan 2011年

Answers:


14

_ViewStart.cshtml在此目录中有吗?我在尝试使用_ViewStart时遇到了同样的问题。然后,我将其重命名为_mydefaultview,将其移至Views/Shared目录,然后切换为在不需要的cshtml文件中不指定视图,并为其余部分指定_mydefaultview。不知道为什么这是必要的,但是它起作用了。


这听起来很奇怪。该_ViewStart视图中的代码之前应该运行,所以这个问题不应该发生。_ViewStart中是否有异常之处?
SLaks 2011年

@ SLaks♦我制作了一个仅包含“ Hello World”进行测试的_viewstart,即使指定Layout = null,Hello World仍会显示。但是,如果我指定_mydefaultview作为布局,那么它也会显示出来。我在_mydefaultview中有@RenderBody()的标签之间显示了“ hello world”。
DMulligan 2011年

4
你误会了_ViewStart。看我的答案。
SLaks

156

我认为这 :

@{
    Layout = "";
 }

与此不同:

@{
    Layout = null;
 }

我用第二个,它正在工作,不包括_Viewstart。


4
这怎么不是这个问题的正确答案?
斯基

1
后者为我工作,这是我想到的第一件事。
Stonetip '17

@Pinski可能是因为它是两年后添加的。:)
WildJoe

35

您(和KMulligan)对_ViewStart页面有误解。

_ViewStart始终在页面开始之前执行。
它旨在用于初始化属性(例如Layout);它通常不应包含标记。(因为没有方法可以覆盖它)。

正确的模式是制作一个单独的布局页面以进行调用RenderBody,然后将Layout属性设置为指向中的该页面_ViewStart

然后Layout,您可以在内容页面中进行更改,更改将生效。


好吧,我_Layout.cshtml包含所有基本设计。并_ViewStart.cshtml致电_Layout.cshtml。我的应用程序的每个模块都有自己的布局页面,但这些布局使用main _Layout.cshtml。当mvc应用程序从viewstart开始时,我想我唯一的解决方案是评论viewstart中的所有内容。并且不会引起任何额外的问题,因为其他页面已经在使用_Layout.cshtml。很简单。
Wahid Masud '18

23

我认为最好与单个“视图”配合使用,我试图从PHP迁移到MVC4,这确实很困难,但是我以正确的方式进行了工作...

回答您的问题,如果您要处理各个页面,只需编辑_ViewStart.cshtml

@{
  Layout = null;
}

如果您在CSS路径方面遇到一些问题,请提供另一个提示...

在网址前放置“ ../”

这是我今天遇到的两个问题,我将以这种方式解决!

问候;


21

确定View是否应使用布局的逻辑不应在_viewStart或中View。将默认设置为in_viewStart很好,但是在view / viewstart中添加任何布局逻辑会阻止该视图在其他任何地方使用(带有或不带有布局)。

您的控制器动作应:

return PartialView()

通过在视图中放置这种逻辑,可以打破M(数据),V(可视),C(逻辑)中的单一职责原则规则。


这与Scott Gu在这里所说的weblogs.asp.net/scottgu/asp-net-mvc-3-layouts相反we could write code within our _ViewStart.cshtml file to programmatically set the Layout property for each View ... we could vary the Layout template that we use depending on what type of device is accessing the site – and have a phone or tablet optimized layout for those devices他显然是在提倡_viewstart作为使用逻辑来切换布局的场所(还提到了控制器和动作过滤器)。因此,与其说是绝对的选择,不如说是优先考虑的问题:在哪里切换布局。
rism

我的偏好是坚持设计模式。您可能会在视图中抛出数据库访问权限,这也是一种错误做法,也可能是“优先事项”。
Erik飞利浦

这是一个相当双曲线的响应,就像“在视图/ viewstart中添加任何布局逻辑会阻止该视图在其他任何地方使用”这样的语句一样。这完全取决于所讨论的应用程序。给定视图不依赖于其布局(主)文件的示例数不胜数。母版只是在这里进行一些品牌或导航,我们可能要做的就是在该版的移动版和桌面版之间切换(除了流体版式)。甚至有人可能会争辩说,实际上是通过使控制器也负责在这种情况下切换布局来破坏SRP。
rism

我对您的最后发言没有看到您的观点。该视图是数据的表示形式。该视图中的任何逻辑意味着无法在其他地方使用该逻辑,并阻止对通常在控制器中发生的逻辑进行测试。控制器已经在MVC中内置了逻辑(IsAjaxRequestChildActionOnly),以确定正确的表示形式。
埃里克·飞利浦

1
在这里,我们谈论的是_ViewStart,它们是ViewResult特定的。所以.. may or may not (JSON/XML) not even be Html rendered by a View Engine没有方位。_layout只是包装视图的视图。(它们并非全部以开头<!DOCTYPE html>)。因此,使_ViewStart根据某些属性(即星期几)打开和关闭_layout可能是完全可行的。在给定的上下文中,它可能会破坏SRP,使ViewA拥有ControllerA,从而确定将ViewA注入到哪个_layout页面,因为这超出了SRP范围。它仅用于支持ViewA <> ViewModelA。
rism

11

使用:

@{
    Layout = null;
 }

摆脱_ViewStart中指定的布局。


2

只需将视图创建为局部视图即可,这样就不会使用布局文件。


2

我想显示不带布局的登录页面,这对我来说非常有用。(这是_ViewStart.cshtml文件)您需要在Controller中设置ViewBag.Title。

@{
    if (! (ViewContext.ViewBag.Title == "Login"))
    {
        Layout = "~/Views/Shared/_Layout.cshtml";        
    } 
}

我知道这有点晚了,但我希望这对身体有所帮助。


2

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

对于初学者来说,此方法是控制ASP.NET MVC应用程序中的Layouts呈现的最简单方法。我们可以识别控制器并将布局呈现为par控制器,为此,我们可以将代码写入Views文件夹根目录下的_ViewStart文件中。以下示例显示了如何完成此操作。

 @{
 var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
 string cLayout = "";
 if (controller == "Webmaster") {
 cLayout = "~/Views/Shared/_WebmasterLayout.cshtml";
 }
 else {
 cLayout = "~/Views/Shared/_Layout.cshtml";
 }
 Layout = cLayout;
 }

步骤2:通过从ActionResult返回来设置布局

ASP.NET MVC的一大功能是,我们可以通过从ActionResult返回布局来覆盖默认布局呈现。因此,这也是在ASP.NET MVC应用程序中呈现不同布局的一种方法。以下代码示例显示了如何完成此操作。

public ActionResult Index()
{
 SampleModel model = new SampleModel();
 //Any Logic
 return View("Index", "_WebmasterLayout", model);
}

过程3:视图-明智的布局(通过在顶部的每个视图内定义布局)

ASP.NET MVC为我们提供了出色的功能和可传真性,可通过在视图上定义布局来覆盖默认布局呈现。为了实现这一点,我们可以按照以下方式在每个View中编写代码。

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

步骤4:将_ViewStart文件放置在每个目录中

这是在ASP.NET MVC应用程序中为每个控制器设置不同布局的一种非常有用的方法。如果我们要为每个目录设置默认布局,则可以通过在每个目录中放置_ViewStart文件以及所需的布局信息,如下所示:

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

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.