【问题标题】:Razor View Without Layout没有布局的 Razor 视图
【发布时间】:2011-09-30 14:45:00
【问题描述】:

当我看到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这个词了吗?
  • 你在哪里设置默认布局?
  • 这个目录下有_viewstart.cshtml吗?当我尝试使用 _viewstart 时,我遇到了同样的问题。然后我将其重命名为 _mydefaultview,将其移至 views/shared 目录,并切换到在我不需要的 cshtml 文件中指定没有视图,并为其余部分指定 _mydefaultview。不知道为什么这是必要的,但它确实有效。
  • 请将其设置为答案,我会将其标记为正确。这肯定是剃须刀的错误?
  • 我不确定这是否是一个错误,_viewstarts 是为了不被覆盖,或者我们做错了什么。我也想知道。

标签: asp.net-mvc asp.net-mvc-3 layout razor


【解决方案1】:

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

【讨论】:

  • 这听起来很奇怪。 _ViewStart 应该在视图中的代码之前运行,所以这个问题不应该发生。你的 _ViewStart 有什么异常吗?
  • @SLaks♦ 我创建了一个仅包含“Hello World”的 _viewstart 进行测试,即使我指定 Layout = null,Hello World 仍会显示。但是,如果我将 _mydefaultview 指定为布局,那么它也会显示出来。 “hello world”出现在标签之间,我在 _mydefaultview 中有 @RenderBody()。
  • 你误会_ViewStart。看我的回答。
【解决方案2】:

您(和 KMulligan)误解了 _ViewStart pages。

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

正确的模式是制作一个单独的布局页面,调用RenderBody,并设置Layout属性指向_ViewStart中的这个页面。

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

【讨论】:

  • 我的_Layout.cshtml 包含所有基本设计。和_ViewStart.cshtml 调用_Layout.cshtml。我的应用程序的每个模块都有自己的布局页面,但这些布局使用主要的_Layout.cshtml。由于 mvc 应用程序从 viewstart 开始,我想我唯一的解决方案是评论 viewstart 中的所有内容。这不会导致任何额外的问题,因为其他页面已经在使用_Layout.cshtml。很简单。
【解决方案3】:

我认为:

@{
    Layout = "";
 }

和这个不一样:

@{
    Layout = null;
 }

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

【讨论】:

  • 这不是这个问题的正确答案吗?
  • 后者对我有用,是我首先想到的。
  • @Pinski 可能是因为它是在 2 年后添加的。 :)
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    我认为最好使用个人“视图”,我正在尝试从 PHP 迁移到 MVC4,这真的很难,但我走在正确的道路上......

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

    @{
      Layout = null;
    }
    

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

    在网址前加上“../”

    这是我今天遇到的两个问题,我就是这样解决的!

    问候;

    【讨论】:

      【解决方案6】:

      逻辑 用于确定视图是否应使用布局不应位于_viewStartView 中。在 _viewStart 中设置默认值是可以的,但在 view/viewstart 中添加任何布局逻辑会阻止该视图在其他任何地方使用(有或没有布局)。

      你的控制器动作应该:

      return PartialView()
      

      通过将这种类型的逻辑放在视图中,您打破了 M(数据)、V(视觉)、C(逻辑)中的Single responsibility principle 规则。

      【讨论】:

      • 这与 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 作为一个使用逻辑来切换布局的地方(还提到了控制器和动作过滤器)。所以这更像是一个偏好问题而不是绝对问题:在哪里切换布局。
      • 我的偏好是坚持设计模式。您可能会在视图中抛出数据库访问权限,这也是不好的做法或“偏好问题”。
      • 这是一个相当夸张的响应,就像“在视图/视图开始中添加任何布局逻辑可以防止该视图在其他任何地方使用”的语句一样。这完全取决于所讨论的应用程序。有无数的例子,其中给定的视图不依赖于它的布局(主)文件。大师只是为了一些品牌或导航而存在,我们可能想要做的就是在移动和桌面布局之间切换(除了流体布局)。甚至有人会争辩说,您实际上是通过让控制器也负责在这种情况下切换布局来破坏 SRP。
      • 我看不到你对你最后陈述的观点。视图是数据的呈现。该视图中的任何逻辑都意味着它不能在其他地方使用,并阻止测试通常在控制器中发生的逻辑。控制器已在 MVC 中内置逻辑(IsAjaxRequestChildActionOnly)以确定正确的呈现方式。
      • 这里我们讨论的是特定于 ViewResult 的 _ViewStart。所以.. may or may not (JSON/XML) not even be Html rendered by a View Engine 没有任何意义。 _layout 只是一个包装视图的视图。 (它们并非都以&lt;!DOCTYPE html&gt; 开头)。因此,根据某些属性(即星期几)让 _ViewStart 打开和关闭 _layouts 可能是完全可行的。在给定的上下文中,它可能会破坏 SRP 以让 ViewA 的 ControllerA 确定将 ViewA 注入哪个 _layout 页面,因为这超出了它的 SRP 范围。它的存在只是为了支持 ViewAViewModelA。
      【解决方案7】:

      我想在没有布局的情况下显示登录页面,这对我来说效果很好。(这是 _ViewStart.cshtml 文件) 需要在Controller中设置ViewBag.Title。

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

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

      【讨论】:

        【解决方案8】:

        用途:

        @{
            Layout = null;
         }
        

        摆脱 _ViewStart 中指定的布局。

        【讨论】:

          【解决方案9】:

          过程一:使用Views文件夹根目录下的_ViewStart文件控制Layouts渲染

          此方法是初学者在 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 为我们提供了如此强大的功能和可传真性,通过在视图上定义布局来覆盖默认布局呈现。为了实现这一点,我们可以在每个视图中按照以下方式编写代码。

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

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

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

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

          【讨论】:

            【解决方案10】:

            如果您正在使用应用程序,请尝试清洁解决方案。为我修复。

            【讨论】:

              【解决方案11】:

              @{ viewbag.title="index" 布局=空; }

              【讨论】:

              • 请添加一些解释
              • 欢迎来到 Stack Overflow。虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
              猜你喜欢
              • 2016-11-02
              • 1970-01-01
              • 2012-10-30
              • 1970-01-01
              • 2013-05-14
              • 1970-01-01
              • 2016-05-23
              • 2019-06-16
              • 2013-08-15
              相关资源
              最近更新 更多