【问题标题】:Difference between RenderBody and RenderSectionRenderBody 和 RenderSection 的区别
【发布时间】:2013-01-12 13:40:55
【问题描述】:

MVC/Razor 语法中,我试图理解为什么我们需要 @RenderBody

例如(代码取自example

<html>
    <head>
        <meta charset="utf-8" />
        <title>My WebSite</title>
        <style>
            #container { width: 700px; }
            #left { float: left; width: 150px; }
            #content { padding: 0 210px 0 160px; }
            #right { float: right; width: 200px; }
            .clear { clear: both; }
        </style>
    </head>
    <body>
        <div id="container">
            <div id="left">
                @RenderSection("left", required:false)
            </div>
            <div id="content">
                @RenderBody()
            </div>
            <div id="right">
                @RenderSection("right", required:false)
            </div>
            <div class="clear"></div>
        </div>
    </body>
</html>


@{
      Layout = "~/_3ColLayout.cshtml";
}

<h1>Main Content</h1>

@section left {
    <h1>Left Content</h1>
}

@section right {
    <h1>Right Content</h1>
}

为什么我不能简单地将@RenderSection 用于所有内容,就像这样:

<div id="content">
     @RenderSection("Body", required:true)
</div>

@section Body{
    <h1>Body Content</h1>
}

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-mvc-5


    【解决方案1】:

    @RenderBody 开始,这很重要。您的 _layout 必须拥有它。这是您的视图将被渲染的地方。如果你忽略它,你的应用程序将会死掉(我认为在运行时,因为视图没有被编译)。

    [更正: 如果没有 Renderbody,引用此特定布局的视图将在运行时消失。 (重要的是要注意布局本身是可选的。)]

    Sections 是在视图中定义的具有相似名称的代码块

    @RenderSection(“导航栏”,必需:假)

    您的视图中可能有相应的代码块。

    @section Navbar{
        <!-- Content Here -->
    }
    

    我强调可以,因为导航栏已被删除required: false

    Section 是每个 View 可以与 _layout 共享功能/标记的一种方式。

    跟进: 在我进行 MVC 开发的有限时间里,我学会了适度使用部分。

    • 节对于确保将 JS 引用放置在 HTML 节中很有用(尽管这是一种过时的做法。
    • 部分对顶部和侧面导航很有用
    • 从不部分是必需的。这样做会使您的代码变得脆弱!

    【讨论】:

    • 感谢您的意见。我想知道为什么 RenderBody 一开始就包含在框架中,而可以简单地使用 RenderSection。但是,正如@Basarat Ali 所提到的,它似乎是为了方便而添加的。
    • 这是个好问题。没有给予足够的重视。
    • 可能并非总是如此,但实际上并不需要 @RenderBody()。正如其他回复中提到的那样,它对于方便和默认约定都很有用。
    • @bingles,你创建了没有 RenderBody() 的布局页面吗?
    【解决方案2】:

    只是因为方便。渲染身体是你最有可能做的事情,所以有一个专门的功能是很好的。防止您为正文声明 @section 并提供更容易调用的函数。

    【讨论】:

    • 感谢您澄清 RenderBody 的角色只是为了方便。
    【解决方案3】:

    RenderBody 是必需的,因为它是渲染每个视图的原因。 RenderSection 有一个可选参数,可让您将该部分标记为不需要。

    【讨论】:

    • 谢谢,不过我的问题是为什么不能将 RenderSection 用于正文——为什么我们需要另一个指令……正文毕竟是页面的一部分。跨度>
    • 似乎这只会增加每个视图的开销,因为所有内容都必须存在于一个或另一个部分中,就像使用母版页的 WebForms 页面需要将所有内容都放在 contentplaceholder 或三。我个人更喜欢隐含的正文部分。
    【解决方案4】:

    here是RenderBody()和RenderPage()的基本信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 2013-08-07
      • 2011-10-20
      相关资源
      最近更新 更多