什么是asp.net MVC中的@RenderSection

Afl*_*red 155 asp.net-mvc

它的目的是什么以及它是如何运作的.我理解捆绑包的作用,但我还没弄清楚它的作用和它可能很重要.

@RenderSection("scripts", required: false)
Run Code Online (Sandbox Code Playgroud)

也许是一个如何使用它的小例子?

cgi*_*els 268

如果您有这样的_Layout.cshtml视图

<html>
    <body>
        @RenderBody()
        @RenderSection("scripts", required: false)
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

那么你可以像这样拥有一个index.cshtml内容视图

@section scripts {
     <script type="text/javascript">alert('hello');</script>
}
Run Code Online (Sandbox Code Playgroud)

需要的指示使用布局页面视图是否必须有一个脚本部分

  • 这并没有回答“目的是什么?”的问题。以及“它是如何运作的?”。 (2认同)

小智 19

如果

(1)你有一个像这样的_Layout.cshtml视图

<html>
    <body>
        @RenderBody()

    </body>
    <script type="text/javascript" src="~/lib/layout.js"></script>
    @RenderSection("scripts", required: false)
</html>
Run Code Online (Sandbox Code Playgroud)

(2)你有Contacts.cshtml

@section Scripts{
    <script type="text/javascript" src="~/lib/contacts.js"></script>

}
<div class="row">
    <div class="col-md-6 col-md-offset-3">
        <h2>    Contacts</h2>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

(3)你有About.cshtml

<div class="row">
    <div class="col-md-6 col-md-offset-3">
        <h2>    Contacts</h2>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

在您的布局页面上,如果需要设置为false"@RenderSection("scripts",required:false)",当页面渲染和用户在页面上时,contacts.js不会渲染.

    <html>
        <body><div>About<div>             
        </body>
        <script type="text/javascript" src="~/lib/layout.js"></script>
    </html>
Run Code Online (Sandbox Code Playgroud)

如果需要设置为true"@RenderSection("scripts",required:true)",当页面渲染和用户在ABOUT页面上时,contacts.js STILL将被渲染.

<html>
    <body><div>About<div>             
    </body>
    <script type="text/javascript" src="~/lib/layout.js"></script>
    <script type="text/javascript" src="~/lib/contacts.js"></script>
</html>
Run Code Online (Sandbox Code Playgroud)

IN SHORT,当设置为true时,无论你是否需要它在其他页面上,无论如何它都会被渲染.如果设置为false,则仅在呈现子页面时呈现.

  • 这是不正确的.你应该自己尝试一下你的答案,你会注意到在设置'true`所需的标志时,在渲染你的About页面时会得到一个`section not defined:"scripts".`. (15认同)
  • 只有我这样还是……这只是错误的吗?https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.razor.razorpage.rendersection?view=aspnetcore-7.0 (2认同)

Vij*_*jay 8

假设我有 GetAllEmployees.cshtml

<h2>GetAllEmployees</h2>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
         // do something ...
    </thead>
    <tbody>
       // do something ...
    </tbody>
</table>

   //Added my custom scripts in the scripts sections

@section Scripts
    {
    <script src="~/js/customScripts.js"></script>
    }
Run Code Online (Sandbox Code Playgroud)

另一个没有脚本的视图“GetEmployeeDetails.cshtml”

<h2>GetEmployeeByDetails</h2>

@Model.PageTitle
<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
       // do something ... 
    </thead>
    <tbody>
       // do something ...
    </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

和我的布局页面“_layout.cshtml”

@RenderSection("Scripts", required: true)
Run Code Online (Sandbox Code Playgroud)

因此,当我导航到 GetEmployeeDetails.cshtml 时。我收到错误消息,指出 GetEmployeeDetails.cshtml 中没有要呈现的部分脚本。如果我将标志从 更改@RenderSection()required : true“required : false”。这意味着渲染视图的 @section 脚本中定义的脚本(如果存在)。否则,不执行任何操作。改进的方法将在 _layout.cshtml 中

@if (IsSectionDefined("Scripts"))
    {
        @RenderSection("Scripts", required: true)
    }
Run Code Online (Sandbox Code Playgroud)