在Asp.Net开发时,用到的JS库、通用的CSS等,在许多页面都会用到,而每次都需要手动引入,相当麻烦,而且有时一旦忘了引用,还得找半天才能找到问题。那有没有什么办法能够一劳永逸的呢?答案是有的。

我们知道Asp.Net是可以通过后台来渲染前端的,所以如果能够在渲染时将所要的js库和css等添入就可以了。而为了能够复用,所以需要进行类的继承。我们写一个Page的基类PageBase,代码如下。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.HtmlControls;
  7. using System.Text;
  8. namespace AspNetLoadJsCss.Common
  9. {
  10. public class PageBase : System.Web.UI.Page
  11. {
  12. public static readonly string SCRIPT_INCLUDE_TEMPLATE = "<script src=\"{0}\" type=\"text/javascript\"></script>\r\n";
  13. public static readonly string STYLE_INCLUDE_TEMPLATE = "\r\n<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\"/>\r\n";
  14. public static readonly string SCRIPT_CONTENT_TEMPLATE = "<script type=\"text/javascript\">{0}</script>\r\n";
  15. protected void Page_InitComplete(object sender, EventArgs e)
  16. {
  17. LiteralControl viewportControl = new LiteralControl();
  18. viewportControl.ID = "viewport";
  19. viewportControl.Text = "\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />";
  20. this.Header.Controls.AddAt(GetNextControlIndex(this), viewportControl);
  21. LiteralControl jqueryCssControl = new LiteralControl();
  22. jqueryCssControl.ID = "/jquery.mobile-1.4.4.min.css";
  23. jqueryCssControl.Text = String.Format(STYLE_INCLUDE_TEMPLATE, "/css/themes/default/jquery.mobile-1.4.4.min.css");
  24. this.Header.Controls.AddAt(GetNextControlIndex(this), jqueryCssControl);
  25. LiteralControl myCssControl = new LiteralControl();
  26. myCssControl.ID = "/my.css";
  27. myCssControl.Text = String.Format(STYLE_INCLUDE_TEMPLATE, "/css/my.css");
  28. this.Header.Controls.AddAt(GetNextControlIndex(this),myCssControl);
  29. String jsPath = "/js/jquery.js";
  30. this.ClientScript.RegisterStartupScript(this.GetType(),
  31. "jquery",
  32. String.Format(SCRIPT_INCLUDE_TEMPLATE, jsPath),
  33. false);
  34. jsPath = "/js/jquery.mobile-1.4.4.min.js";
  35. this.ClientScript.RegisterStartupScript(this.GetType(),
  36. "jquery.mobile",
  37. String.Format(SCRIPT_INCLUDE_TEMPLATE, jsPath),
  38. false);
  39. jsPath = "/js/default.js";
  40. this.ClientScript.RegisterStartupScript(this.GetType(),
  41. "default",
  42. String.Format(SCRIPT_INCLUDE_TEMPLATE, jsPath),
  43. false);
  44. }
  45. /// <summary>
  46. /// 取得下一个控件的位置
  47. /// </summary>
  48. /// <returns></returns>
  49. private static int GetNextControlIndex(Page page)
  50. {
  51. int index = 0;
  52. // 如果存在自定义(以CONTROL_ID_PREFIX开头)的控件,则返回最后一个自定义控件的下一个位置
  53. // 如果不存在自定义的控件,则返回<title>的下一个位置
  54. bool startControlBlock = false;
  55. int titleIndex = 0;
  56. String CONTROL_ID_PREFIX = "";
  57. foreach (Control c in page.Header.Controls)
  58. {
  59. if (c is HtmlTitle)
  60. {
  61. titleIndex = index;
  62. }
  63. if (c.ID != null && c.ID.StartsWith(CONTROL_ID_PREFIX))
  64. {
  65. startControlBlock = true;
  66. }
  67. else
  68. {
  69. if (startControlBlock)
  70. {
  71. break;
  72. }
  73. }
  74. index++;
  75. }
  76. int retIndex = startControlBlock ? index : titleIndex + 1;
  77. if (retIndex < 0)
  78. {
  79. retIndex = 0;
  80. }
  81. else if (retIndex >= page.Header.Controls.Count)
  82. {
  83. retIndex = page.Header.Controls.Count - 1;
  84. }
  85. return retIndex;
  86. }
  87. protected virtual void Page_Load(object sender, EventArgs e)
  88. {
  89. }
  90. }
  91. }

注:

1.在页面初始化完成的时候载入相应的JS和CSS文件,所以在Page_InitComplete中实现代码。

2.对于CSS文件需要添加到header中,所以使用Header来添加LiteralControl的CSS控件。

3.对于JS文件,使用注册的方式来载入。

4.如果需要载入一些通用的JS函数或者CDATA,也可以考虑这种方式。

有了PageBase页面之后,对于需要加载这些JS和CSS的页面,就可以直接继承于PageBase,然后重载Page_Load函数,其他的就是正常的写法了。比如

Test页面的后端代码

  1. public partial class Test: PageBase
  2. {
  3. protected override void Page_Load(object sender, EventArgs e)
  4. {
  5. }
  6. }

Test页页的前端代码

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="AspNetLoadJsCss.Test" %>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head runat="server">
  5. <title></title>
  6. </head>
  7. <body>
  8. <form id="form1" runat="server">
  9. </form>
  10. </body>
  11. </html>

渲染后的HTML页面

可以看到CSS和JS都已经载入了。

Asp.Net之后台加载JS和CSS的更多相关文章

  1. 动态加载js和css

    开发过程中经常需要动态加载js和css,今天特意总结了一下常用的方法. 1.动态加载js 方法一:动态加载js文件 // 动态加载js脚本文件 function loadScript(url) { v ...

  2. 动态加载js、css 代码

    一.原生js: /** * 加载js和css文件 * @param jsonData.path 前缀路径 * @param jsonData.url 需要加载的js路径或css路径 * @param ...

  3. 动态加载js和css的jquery plugin

    一个简单的动态加载js和css的jquery代码,用于在生成页面时通过js函数加载一些共通的js和css文件. //how to use the function below: //$.include ...

  4. PHP:如果正确加载js、css、images等静态文件

    日常中,我们想要把一些静态页面放在框架上或者是进行转移时,那么静态页面上的原url加载js.css.images都会失效,那么我们应该怎么进行修改捏? 现在仓鼠做个笔记哈 这里有几个注意项: 1.路径 ...

  5. js插件动态加载js、css解决方案

    最近因为工作需要做了一个js自动导入的插件,一开始很天真的以为动态创建个script添加到head中就ok了,试了之后才发现了问题,就是如果同时引入了多个js文件,而且后一个文件中用到了前一个文件中的 ...

  6. 经验总结:按需加载JS和css

    项目中做过这样的事情:所有页面都通过SSI指令 include这样一份public-js.shtml, 用来引入涉及到的js(包括公共的脚本 验证插件 自定义组件等),但是一些没有交互效果的页面根本不 ...

  7. Yii2 灵活加载js、css

    Yii2.0对于CSS/js 管理,使用AssetBundle资源包类. 视图如何按需加载CSS/JS ? 资源包定义: backend/assets/AppAsset.PHP <?php na ...

  8. 移动端性能优化动态加载JS、CSS

    JS CODE (function() { /** * update: * 1.0 */ var version = "insure 1.1.0"; var Zepto = Zep ...

  9. JavaScript(第二十二天)【动态加载js和css】

    学习要点: 1.元素位置 2.动态脚本 3.动态样式 本章主要讲解上一章剩余的获取位置的DOM方法.动态加载脚本和样式.   一.元素位置 上一章已经通过几组属性可以获取元素所需的位置,那么这节课补充 ...

随机推荐

  1. 使用IDEA进行代码托管

    在idea菜单栏的file中打开settings/搜索git,配置path to Git executable:C:\Program Files\Git\bin\git.exe(git bash的安装 ...

  2. 20145222黄亚奇《Java程序设计》第8周学习总结

    教材学习内容总结 第15章 通用API 1 日志 1 日志API简介 java.util.loggging包提供了日志功能相关类与接口. 使用日志的起点是Logger类,Logger类的构造函数表示为 ...

  3. 学习笔记——Maven实战(五)自动化Web应用集成测试

    自动化集成测试的角色 本专栏的上一篇文章讲述了Maven与持续集成的一些关系及具体实践,我们都知道,自动化测试是持续集成必不可少的一部分,基本上,没有自动化测试的持续集成,都很难称之为真正的持续集成. ...

  4. node 学习笔记 - fs 文件操作

    本文同步自我的个人博客:http://www.52cik.com/2015/12/03/learn-node-fs.html 最近看到群里不少大神都开始玩 node 了,我感觉跟他们步伐越来越大了, ...

  5. Hadoop的Server及其线程模型分析

    早期的一篇文章,针对Hadoop 2.6.0. 一.Listener Listener线程,当Server处于运行状态时,其负责监听来自客户端的连接,并使用Select模式处理Accept事件. 同时 ...

  6. 编写高质量代码改善C#程序的157个建议[C#闭包的陷阱、委托、事件、事件模型]

    前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议38.小心闭包中的陷阱 建议39.了解委托的实质 建议40 ...

  7. 第二课:判断js变量的类型以及domReady的原理

    1.类型的判断: js五种简单数据类型有:null,undefined,boolean,number,string. 还有复杂的数据类型:Object,Function,RegExp,Date,自定义 ...

  8. Bata版本冲刺计划及安排

    下一阶段需要改进完善的功能 UI: 1. 界面不够精细,布局不够美观并且尚有BUG没有解决,图形.色彩间不够协调. 2. 理清界面间的跳转逻辑. 搜索: 搜索成功并定位后,不会影响地理标签的显示. 定 ...

  9. 转-JS中document对象详解

    对象属性 document.title //设置文档标题等价于HTML的<title>标签 document.bgColor //设置页面背景色 document.fgColor //设置 ...

  10. zoj3882 博弈

    我理解错题目意思,稀里糊涂A了.其实就是先手必胜. #include<stdio.h> int main() { int n; while(scanf("%d",&am ...