代码改变世界

为Asp.net MVC中的RenderSection设置默认内容

  JustRun  阅读(7636)  评论(2编辑  收藏  举报

1. RenderSection的简单介绍

Asp.net MVC中提供了RenderSection方法,这样就能够在Layout中定义一些区块,这些区块留给使用Layout的view来实现
比如我们定义的Layout如下, 定义了一个”Footer”的section, 把这个section留给各个view去填充。

复制代码
<!DOCTYPE html>
<html>
     <head>
           <title>Sample Layout</head>
     <body>
            <div>@RenderBody()</div>
            <footer>@RenderSection("Footer")</footer>
     </body>
</html>
复制代码

 在使用该Layout的view中,可以这样来填充“Footer” section.

@{
    Layout = "MyLayout.cshtml";

}
<h1>Main Content!</h1>
@section Footer {
    This is the footer.
} 

RenderSection方法还有一个参数, 如果使用RenderSection(“Footer”, false) ,则表示,这个section Footer,view中不是必须要实现。

2,在Layout中定义一个具有默认值的Section

问题的由来是这样的,项目中使用到了Jquery 1.4.4, 想升级到Jquery到更高的版本,但是由于已有的一些js代码只能兼容Jquery1.4.4, 所以没有办法简单的把Jquery的引用在Layout中直接替换到更高版本。

这个时候,我想到了section, 不如在Layout中定义一个Jquery的section, 新开发的页面在这个section里面使用更高版本的Jquery, 而原有的页面就还是用旧版本的.
这个section应该有个默认值,也就是就的Jquery引用,新的view中只要替换就可以了。

无奈,MVC中默认的RenderSection没有提供这种实现,于是,通过扩展RenderSection方法,实现了该功能。

3, 具体的实现代码

定义一个静态类WebPageBaseExtension, 扩展RenderSection方法

复制代码
public static class WebPageBaseExtension
{
       public static HelperResult RenderSection(this WebPageBase webPage, string name, Func<dynamic, HelperResult> defaultContents)
       {
           if (webPage.IsSectionDefined(name))
           {
               return webPage.RenderSection(name);
           }
           return defaultContents(null);
       }
}
复制代码

在Layout中使用该方法,定义默认section内容

<head>

@this.RenderSection("Jquery", @<script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>)
   <script src="@Url.Content("~/Scripts/jquery-ui.min.js")" type="text/javascript"></script>

………

</head>

在新开发的页面上,覆盖默认section, 使用新的版本的Jquery

@section Jquery
{
    <script src="@Url.Content("~/Scripts/jquery-1.9.min.js")" type="text/javascript"></script>
}

这样就大功告成了,新版本的Jquery就能够应用到新页面中了,以后再慢慢修改旧的页面,也迁移到新版本的Jquery, 最后就可以移除掉整个Jquery section,一步一步达到渐进升级的过程。

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2012-08-01 NAnt常见问题
点击右上角即可分享
微信分享提示