Asp.net mvc 在ASP.NET MVC中,使用@RenderSection(相对于@RenderPage)有什么好处?

Asp.net mvc 在ASP.NET MVC中,使用@RenderSection(相对于@RenderPage)有什么好处?,asp.net-mvc,Asp.net Mvc,如果我做错了什么事,我希望得到启发。我敢打赌我是 如果我的查看页面中有以下代码: @{ ViewBag.Title = "About Us"; } <h2>About</h2> <p> sample content. </p> @section header { <div id="header"> Chapter 3a: Creating a Consistent Look </d

如果我做错了什么事,我希望得到启发。我敢打赌我是

如果我的查看页面中有以下代码:

@{
    ViewBag.Title = "About Us";
}

<h2>About</h2>
<p>
    sample content.
</p>
@section header
{
    <div id="header">
        Chapter 3a: Creating a Consistent Look
    </div>
}
但是,如果我没有在呈现节之前检查节的最后4行(比如,我对它们全部进行了注释),编译器将不会检查我是否在视图页面中定义了节,并允许我构建和运行应用程序。在运行时,只有在运行页面时才会出现以下错误:

以下部分已定义,但尚未呈现 对于布局页面“~/Views/Shared/_Layout2.cshtml”:“页眉”

我的问题如下:

  • 我们怎样才能防止这种情况发生?是否有任何设置强制编译器检查缺少的
    @RenderSection
    代码
  • 由于我们需要在整个应用程序中手动搜索
    @section
    关键字,使用
    @section
    功能是否会降低系统的可维护性(假设问题1没有肯定答案)
  • 在这种情况下,使用
    @RenderSection
    @RenderPage
    相比有什么好处
  • 我们是否可以将
    @部分设置为有条件的

  • 我从没想过这是个问题。在aspx语法中,占位符的概念是相同的,因此如果您的主页中有2个占位符,那么您应该在使用该母版页的每个页面/视图中有2个内容

    Phil Haack在争论中有一篇博客文章,它并没有直接解决你的问题,但肯定是有意思的。
    我知道它很旧,但如果有人路过这里

    @RenderSection(“header”,required:false)通过此选项,您可以 @是否在您的查看页面中显示节头{}

    现在还可以从布局中删除检查条件。 也以此为条件

    如果需要,您可以:
    @RenderSection(“header”,必选:true),但是如果您的视图没有@section头,它将抛出一个错误。

    感谢您的快速回答。至于节与占位符概念的关系,据我所知,占位符对象的存在和/或不存在是在服务器端代码中检查的(因为如果页面中不存在占位符对象,则不能在代码隐藏中使用占位符对象),而字符串(例如,“页眉”)在编译时未检查。我希望我正确理解了您对占位符的使用。谢谢事实上,不是。这不是它的工作原理。代码隐藏根本不相关。实际上,由于Mvc2 aspx视图甚至没有代码隐藏文件。我的意思是,在概念级别,标记等价于@RenderSection()语句,标记等价于@section{}声明。我并不是说它们的工作原理完全相同。不过,我确信在编译时没有检查这两个选项。您可以尝试在csproj中将标记设置为true,看看是否有任何改进。我理解您的意思。我以为你指的是这个占位符()而不是这个占位符()。至于它们的相似性(ContentPlaceHolder==@RenderSection();Content==@section),据我所知,您似乎是正确的。但是,ContentPlaceHolder/内容对与@RenderSection()/@节对不同的是,ContentPlaceHolder/内容对(及其相互之间的关系)比@RenderSection()更明显/明确/可见/@除了IDE提供了工具,当您想在ASPX页面中使用ContentPlaceHolder(在母版页中)时,可以将两者连接起来。
    @if (IsSectionDefined("header"))
    { 
        @RenderSection("header")
    }