什么是Web浏览器的缓存机制?如何控制和清除浏览器缓存?


⭐ 专栏简介

前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个专栏中,我们将以问答形式每天更新,为大家呈现精选的前端知识点和常见问题解答。通过问答形式,我们希望能够更直接地回应读者们对于前端技术方面的疑问,并且帮助大家逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是各种常用框架和工具,我们将深入浅出地解释概念,并提供实际案例和练习来巩固所学内容。同时,我们也会分享一些实用技巧和最佳实践,帮助你更好地理解并运用前端开发中的各种技术。

在这里插入图片描述

不仅如此,我们还会定期推出一些项目实战教程,让你能够将所学知识应用到实际开发中。通过实际项目的练习,你将能够更好地理解前端开发的工作流程和方法论,并培养自己解决问题和独立开发的能力。我们相信,只有不断积累和实践,才能真正掌握前端开发技术。因此,请准备好迎接挑战,勇敢地踏上这段前端入门之旅!无论你是寻找职业转型、提升技能还是满足个人兴趣,我们都将全力以赴,为你提供最优质的学习资源和支持。让我们一起探索Web开发的奇妙世界吧!加入前端入门之旅,成为一名出色的前端开发者! 让我们启航前端之旅,下面图片中介绍的是博主除了本专栏外正在输出的其他专栏;(跳过下方的图片咱们开始今天的正文!!!)

在这里插入图片描述


⭐ Web浏览器的缓存机制

Web浏览器的缓存机制是一种将Web页面的资源(如HTML、CSS、JavaScript、图像等)保存在本地存储器中,以便在后续访问相同页面时能够更快地加载和渲染页面内容的技术。缓存有助于提高网站性能和用户体验,并减少对服务器的请求负载。

缓存可以分为两种主要类型:

  1. 浏览器缓存(Browser Cache):浏览器会自动将已下载的资源保存在本地,以便后续访问相同页面时可以直接使用这些资源,而不必重新从服务器下载。

  2. 代理服务器缓存(Proxy Server Cache):代理服务器(如CDN,Content Delivery Network)也可以缓存网站资源,减少距离用户更远的服务器的负载,提供更快的资源响应。


⭐ 浏览器缓存的工作原理

浏览器缓存的工作原理涉及以下几个关键概念:

  • 缓存标识符(Cache Identifier):每个资源都有一个唯一的缓存标识符,通常是资源的URL。

  • 缓存状态(Cache Status):浏览器会检查缓存状态来确定是否使用缓存。状态包括:

    • 未缓存(Uncached):资源尚未被缓存。
    • 从服务器获取(Stale):资源已被缓存,但可能已过期或需要重新验证。
    • 有效缓存(Valid):资源已被缓存且仍然有效,可以直接从缓存中加载。
  • 缓存控制策略(Cache-Control):HTTP响应标头中的Cache-Control字段用于指定资源的缓存行为,例如,是否可以缓存、缓存的有效期等。

  • 缓存位置(Cache Location):浏览器可以将缓存的资源保存在不同位置,如内存缓存、磁盘缓存等,这取决于资源的使用频率和大小。


⭐ 控制和清除浏览器缓存

控制和清除浏览器缓存通常是通过HTTP标头和浏览器设置来实现的。

控制缓存

1、使用Cache-Control标头

通过在服务器的HTTP响应中设置Cache-Control标头,您可以控制浏览器的缓存行为。一些常见的Cache-Control指令包括:

  • max-age:指定资源在缓存中的最大有效时间(秒)。
  • no-cache:要求浏览器不直接使用缓存的版本,而是发送请求进行验证。
  • no-store:禁用缓存,不允许浏览器缓存资源。
Cache-Control: max-age=3600, public

2、使用ETagLast-Modified标头

服务器可以使用ETagLast-Modified标头来验证资源的新鲜度。浏览器在后续请求中可以将If-None-MatchIf-Modified-Since标头发送给服务器,以检查资源是否发生更改。如果未发生更改,服务器可以返回304 Not Modified响应,浏览器将继续使用缓存版本。


⭐ 清除缓存

用户和开发人员可以执行以下操作来清除浏览器缓存:

1、用户清除缓存

  • 手动清除浏览器缓存:用户可以通过浏览器设置界面手动清除缓存。

  • 使用快捷键:在大多数浏览器中,用户可以使用快捷键组合来清除缓存。例如,在Google Chrome中,您可以按下Ctrl + Shift + Delete(Windows/Linux)或Command + Shift + Delete(Mac)来打开清除浏览数据选项。

  • 自动清除设置:一些浏览器允许用户设置自动清除缓存的规则,例如每次关闭浏览器时清除缓存。

2、开发人员控制

开发人员可以通过以下方法来控制浏览器缓存:

  • 更改资源URL:通过在资源URL中添加查询参数或文件名哈希来强制浏览器重新下载资源。例如,style.css?v=2script.abc123.js

  • 更改Cache-Control标头:在服务器端更改Cache-Control标头,以更改缓存策略,使浏览器不缓存或重新验证资源。

  • 使用Service Worker:Service Worker是一种浏览器特性,可以在Web应用中进行精细的缓存控制,包括离线缓存和动态缓存策略。

总之,Web浏览器的缓存机制是提高性能和减少服务器负担的重要组成部分。开发人员可以通过设置HTTP响应标头来控制缓存策略,而用户可以通过浏览器设置来手动清除缓存,以确保获得最新的网页内容。在开发和维护Web应用程序时,了解和合理利用缓存机制非常重要。


⭐ 写在最后

本专栏适用读者比较广泛,适用于前端初学者;或者没有学过前端对前端有兴趣的伙伴,亦或者是后端同学想在面试过程中能够更好的展示自己拓展一些前端小知识点,所以如果你具备了前端的基础跟着本专栏学习,也是可以很大程度帮助你查漏补缺,由于博主本人是自己再做内容输出,如果文中出现有瑕疵的地方各位可以通过主页的左侧联系我,我们一起进步,与此同时也推荐大家几份专栏,有兴趣的伙伴可以订阅一下:除了下方的专栏外大家也可以到我的主页能看到其他的专栏;

前端小游戏(免费)这份专栏将带你进入一个充满创意和乐趣的世界,通过利用HTML、CSS和JavaScript的基础知识,我们将一起搭建各种有趣的页面小游戏。无论你是初学者还是有一些前端开发经验,这个专栏都适合你。我们会从最基础的知识开始,循序渐进地引导你掌握构建页面游戏所需的技能。通过实际案例和练习,你将学会如何运用HTML来构建页面结构,使用CSS来美化游戏界面,并利用JavaScript为游戏添加交互和动态效果。在这个专栏中,我们将涵盖各种类型的小游戏,包括迷宫游戏、打砖块、贪吃蛇、扫雷、计算器、飞机大战、井字游戏、拼图、迷宫等等。每个项目都会以简洁明了的步骤指导你完成搭建过程,并提供详细解释和代码示例。同时,我们也会分享一些优化技巧和最佳实践,帮助你提升页面性能和用户体验。无论你是想寻找一个有趣的项目来锻炼自己的前端技能,还是对页面游戏开发感兴趣,前端小游戏专栏都会成为你的最佳选择。点击订阅前端小游戏专栏

在这里插入图片描述

Vue3通透教程【从零到一】(付费) 欢迎来到Vue3通透教程!这个专栏旨在为大家提供全面的Vue3相关技术知识。如果你有一些Vue2经验,这个专栏都能帮助你掌握Vue3的核心概念和使用方法。我们将从零开始,循序渐进地引导你构建一个完整的Vue应用程序。通过实际案例和练习,你将学会如何使用Vue3的模板语法、组件化开发、状态管理、路由等功能。我们还会介绍一些高级特性,如Composition API和Teleport等,帮助你更好地理解和应用Vue3的新特性。在这个专栏中,我们将以简洁明了的步骤指导你完成每个项目,并提供详细解释和示例代码。同时,我们也会分享一些Vue3开发中常见的问题和解决方案,帮助你克服困难并提升开发效率。无论你是想深入学习Vue3或者需要一个全面的指南来构建前端项目,Vue3通透教程专栏都会成为你不可或缺的资源。点击订阅Vue3通透教程【从零到一】专栏

在这里插入图片描述

TypeScript入门指南(免费) 是一个旨在帮助大家快速入门并掌握TypeScript相关技术的专栏。通过简洁明了的语言和丰富的示例代码,我们将深入讲解TypeScript的基本概念、语法和特性。无论您是初学者还是有一定经验的开发者,都能在这里找到适合自己的学习路径。从类型注解、接口、类等核心特性到模块化开发、工具配置以及与常见前端框架的集成,我们将全面覆盖各个方面。通过阅读本专栏,您将能够提升JavaScript代码的可靠性和可维护性,并为自己的项目提供更好的代码质量和开发效率。让我们一起踏上这个精彩而富有挑战性的TypeScript之旅吧!点击订阅TypeScript入门指南专栏

在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
注意:由于文件大小为111MB,但本人的上传权限只有60MB,所以分开两部分压缩上传。解压前必须与part2一起解压。part2在本人的资源里可以找到:http://download.csdn.net/user/lxm0918 第1章 服务器控件概述及开发环境部署 .1 1.1 自定义服务器控件 1 1.2 服务器控件在软件开发过程中的作用 1 1.3 在控件开发中提升自己 2 1.4 可继承控件基类介绍 2 1.5 运行一个简单的控件 7 1.5.1 开发一个简单控件 7 1.5.2 部署和运行 11 1.6 控件生命周期 12 1.6.1 概述 12 1.6.2 用代码跟踪控件生命周期过程 14 1.7 本章总结 17 第2章 服务器控件开发中的调试技术 18 2.1 预置代码示例 18 2.2 调试页面服务端代码 19 2.3 服务器控件的调试 20 2.3.1 运行模式下的调试方法 20 2.3.2 设计模式下的调试方法 20 2.4 javascript脚本调试方法 22 2.4.1 调试页面中的javascript脚本(方法一) 22 .2.4.2 调试页面中的javascript脚本(方法二) 23 2.4.3 调试非嵌入式javascript脚本文件 23 2.4.4 调试嵌入式javascript脚本资源文件 24 2.4.5 高效率调试的技巧 24 2.5 ajax library对javascript调试支持 26 2.6 本章总结 26 第3章 从零开始开发服务器控件 27 3.1 选择基类 27 3.2 控件呈现顺序 28 3.3 render呈现控件的几种方式 30 3.3.1 使用htmltextwriter类输出 30 3.3.2 直接输出html标签 32 3.3.3 使用服务器控件的rendercontrol方法 33 3.4 addattributestorender方法 34 3.5 createchildcontrols方法 35 3.6 inamingcontainer接口 36 3.7 实现复合控件 38 3.7.1 createchildcontrols方法 39 3.7.2 childcontrolscreated属性 39 3.7.3 ensurechildcontrols方法 39 3.7.4 recreatechildcontrols方法 39 3.7.5 controls属性 40 3.7.6 hascontrols方法 40 3.7.7 hasevents方法 40 3.7.8 findcontrol方法 41 3.7.9 实现复合控件示例 41 3.8 常用开发技巧 51 3.8.1 designmode属性 51 3.8.2 屏蔽基类控件中的属性 52 3.8.3 page.request.browser属性 53 3.8.4 设置控件id规范 53 3.8.5 增强findcontrol功能 54 3.8.6 映射服务端控件值到客户端 55 3.8.7 禁止派生自compositecontrol的控件创建子控件 56 3.8.8 使用createchildcontrols的注意事项 56 3.8.9 不要误解设计元属性defaultvalue 57 3.8.10 在render方法中利用基类资源 57 3.8.11 条件编译&条件属性 60 3.9 本章总结 61 第4章 服务器控件属性 62 4.1 控件属性的作用 62 4.1.1 系统属性 62 4.1.2 自定义属性 62 4.2 简单属性 63 4.3 属性的设计特性 64 4.4 复杂属性 67 4.4.1 概述 67 4.4.2 复杂属性的几种标记形式 67 4.4.3 深入研究——复杂属性分析器 79 4.5 深入研究——定制自己的属性编辑器 85 4.5.1 系统属性编辑器 85 4.5.2 定制属性编辑器 91 4.6 类型转换器 126 4.6.1 系统类型转换器 126 4.6.2 定制自己的类型转换器 128 4.7 实现自定义属性 138 4.8 本章总结 145 第5章 事件和数据回发机制 146 5.1 控件事件和数据回发概述 146 5.1.1 事件及其意义 146 5.1.2 数据回发机制 147 5.2 事件和数据回发机制的实现 148 5.2.1 客户端回传事件接口ipostbackeventhandler 148 5.2.2 客户端回发/回调揭密 150 5.2.3 回传数据处理接口ipostbackdatahandler 153 5.2.4 正确处理继承基类中控件的事件 159 5.2.5 扩展kingtextbox控件功能(kingtextboxcanpostevent控件) 161 5.3 复合控件的事件处理机制 168 5.3.1 高效率事件集合对象 168 5.3.2 定制自己的委托和事件参数类 170 5.3.3 复合控件的事件处理 175 5.3.4 自动完成功能控件searchcontrolintelligent 185 5.4 本章总结 193 第6章 页面状态机制 194 6.1 页面状态概述 194 6.2 视图状态机制 195 6.2.1 istatemanager接口 195 6.2.2 控件生命周期中的装载和保存视图阶段 196 6.2.3 简单类型视图状态应用 197 6.2.4 实现自定义类型视图状态 205 6.3 控件状态机制 217 6.4 视图状态和控件状态的关系 221 6.4.1 在禁用视图状态的情况下仍然使用viewstate对象 221 6.4.2 istatemanager接口仍然可以在控件状态中使用 223 6.4.3 视图状态和控件状态组合使用规则 225 6.5 加密页面状态 225 6.6 清除页面状态 226 6.7 对动态添加控件的视图状态分析 228 6.8 自定义类型转换器实现高效率序列化 231 6.9 页面状态性能优化策略 238 6.9.1 存储位置优化——把视图状态信息保存在服务端而非客户端 238 6.9.2 体积优化——压缩视图状态数据 240 6.9.3 分块存储视图状态数据 243 6.10 视图状态和控件状态的总结 243 6.11 本章总结 244 第7章 定制自定义控件主题样式 245 7.1 控件样式概述 245 7.2 asp.net对样式的支持 245 7.2.1 style类的工作原理及使用 245 7.2.2 webcontrol基类对样式的支持功能及其工作原理 249 7.2.3 htmltextwriter类对控件样式的支持 252 7.2.4 定义控件内部的样式属性规则 253 7.2.5 两个常用转换方法 256 7.3 应用示例 260 7.3.1 复合控件样式及视图状态 260 7.3.2 控件结构与样式分离方案 268 7.4 本章总结 295 第8章 控件客户端编程模型 297 8.1 asp.net服务端控件对客户端的支持 297 8.2 clientscriptmanager类功能详解 301 8.2.1 registerarraydeclaration方法 301 8.2.2 registerclientscriptblock方法 302 8.2.3 registerclientscriptinclude方法 303 8.2.4 registerclientscriptresource方法 304 8.2.5 registerstartupscript方法 305 8.2.6 registerexpandoattribute方法 305 8.2.7 registerhiddenfield方法 306 8.2.8 getcallbackeventreference方法 307 8.2.9 getpostbackclienthyperlink方法 307 8.2.10 getpostbackeventreference方法 308 8.2.11 getwebresourceurl方法 308 8.2.12 registeronsubmitstatement方法 309 8.3 客户端回调 309 8.4 客户端控件应用示例 323 8.4.1 封装js客户端对象 323 8.4.2 封装htc客户端对象 343 8.4.3 在线签名控件示例应用 371 8.5 常用的一些javascript框架 385 8.6 本章总结 387 第9章 定制用户控件 388 9.1 用户控件概述 388 9.1.1 用户控件的作用.. 388 9.1.2 了解system.web.ui.usercontrol基类 388 9.2 用户控件应用示例 389 9.2.1 简单用户控件 389 9.2.2 复杂数据绑定用户控件 394 9.3 用户控件缓存 419 9.3.1 asp.net缓存介绍 419 9.3.2 用户控件缓存 420 9.4 本章总结 421 第10章 开发验证控件 422 10.1 验证控件的工作原理 422 10.1.1 内置验证控件简述 422 10.1.2 验证控件的工作机制解析 423 10.2 实现自定义验证控件 443 10.3 本章总结 451 第11章 在控件中使用嵌入资源 452 11.1 在控件中嵌入资源的原理 452 11.2 在控件中应用嵌入资源 453 11.2.1 在控件中使用嵌入资源 453 11.2.2 常用嵌入资源类型及用法 455 11.3 浏览器常用工具 460 11.3.1 httpwatch 460 11.3.2 ie develper toolbar 461 11.3.3 fiddler 461 11.4 本章总结 462 第12章 开发模板数据绑定控件 463 12.1 asp.net模板属性控件机制 463 12.1.1 模板属性介绍 463 12.1.2 asp.net对模板控件的支持 464 12.1.3 repeater控件模板实现机制解析 466 12.2 自定义控件应用示例 469 12.2.1 模板控件功能 469 12.2.2 应用示例 470 12.3 本章总结 489 第13章 数据绑定和数据源控件 490 13.1 数据绑定控件 490 13.1.1 数据绑定控件概述 490 13.1.2 asp.net对数据绑定控件的支持 491 13.2 数据绑定控件示例应用 501 13.2.1 控件实现功能 501 13.2.2 应用示例 502 13.3 数据源控件 508 13.3.1 数据源控件概述 508 13.3.2 asp.net对数据源控件的支持 508 13.4 数据源控件示例应用 515 13.4.1 控件实现功能 515 13.4.2 应用示例 516 13.5 本章总结 522 第14章 扩展控件方案——gridview 523 14.1 扩展控件概述 523 14.2 任意定制gridview多表头 523 14.2.1 功能概述 523 14.2.2 代码实现 524 14.3 固定gridview表头并增加滚动条支持 527 14.3.1 功能概述 527 14.3.2 代码实现 528 14.4 本章总结 533 第15章 自定义控件设计模式下编程汇总 534 15.1 .net框架对设计支持 534 15.2 设计元数据支持 535 15.3 复杂属性序列化 539 15.4 类型转换器 539 15.5 属性编辑器 540 15.6 设计模式可用基类介绍 541 15.7 设计对控件呈现的支持 543 15.7.1 概述 543 15.7.2 应用示例 543 15.8 自动套用格式 546 15.8.1 概述 546 15.8.2 应用示例 547 15.9 模板ui设计器 551 15.10 智能操作列表 552 15.10.1 概述 552 15.10.2 应用示例 552 15.11 控件设计器区域 558 15.11.1 概述 558 15.11.2 应用示例 558 15.12 本章总结 562 第16章 asp.net ajax控件开发——客户端 563 16.1 asp.net ajax框架概述 563 16.2 ajax library对客户端面向对象功能支持 564 16.2.1 命名空间及type和function类 565 16.2.2 接口类型 568 16.2.3 类类型以及面向对象继承特征 569 16.2.4 枚举类型 570 16.2.5 反射功能 570 16.3 ajax library中的常用类型 571 16.3.1 ajax library对javascript基类型的扩展 571 16.3.2 sys.stringbuilder类 576 16.4 ajax library请求服务端和webservices 577 16.4.1 sys.net命名空间中的类 577 16.4.2 请求过程解析 578 16.4.3 webrequest请求示例 579 16.4.4 使用代理实现ajax调用服务端示例 581 16.5 ajax library对控件客户端类开发的支持 584 16.5.1 客户端控件基成员(类/接口) 584 16.5.2 asp.net ajax控件客户端生命周期 589 16.6 客户端控件示例应用 592 16.7 调试和跟踪 603 16.8 本章总结 605 第17章 asp.net ajax控件开发——服务端 606 17.1 asp.net ajax服务器控件概述 606 17.2 ajax服务器控件 607 17.2.1 ajax服务器控件 607 17.2.2 asp.net ajax扩展程序控件 612 17.3 asp.net ajax对服务器控件支持的基类 612 17.3.1 ajax控件支持的基类 612 17.3.2 ajax控件应用示例 623 17.4 本章总结 636 附录a .net 3.5技术教程系列——collection/asp.net ajax/ silverlight/jquery ...646
注意:由于文件大小为111MB,但本人的上传权限只有60MB,所以分开两部分压缩上传。解压前必须与part2一起解压。part2在本人的资源里可以找到:http://download.csdn.net/user/lxm0918 第1章 服务器控件概述及开发环境部署 .1 1.1 自定义服务器控件 1 1.2 服务器控件在软件开发过程中的作用 1 1.3 在控件开发中提升自己 2 1.4 可继承控件基类介绍 2 1.5 运行一个简单的控件 7 1.5.1 开发一个简单控件 7 1.5.2 部署和运行 11 1.6 控件生命周期 12 1.6.1 概述 12 1.6.2 用代码跟踪控件生命周期过程 14 1.7 本章总结 17 第2章 服务器控件开发中的调试技术 18 2.1 预置代码示例 18 2.2 调试页面服务端代码 19 2.3 服务器控件的调试 20 2.3.1 运行模式下的调试方法 20 2.3.2 设计模式下的调试方法 20 2.4 javascript脚本调试方法 22 2.4.1 调试页面中的javascript脚本(方法一) 22 .2.4.2 调试页面中的javascript脚本(方法二) 23 2.4.3 调试非嵌入式javascript脚本文件 23 2.4.4 调试嵌入式javascript脚本资源文件 24 2.4.5 高效率调试的技巧 24 2.5 ajax library对javascript调试支持 26 2.6 本章总结 26 第3章 从零开始开发服务器控件 27 3.1 选择基类 27 3.2 控件呈现顺序 28 3.3 render呈现控件的几种方式 30 3.3.1 使用htmltextwriter类输出 30 3.3.2 直接输出html标签 32 3.3.3 使用服务器控件的rendercontrol方法 33 3.4 addattributestorender方法 34 3.5 createchildcontrols方法 35 3.6 inamingcontainer接口 36 3.7 实现复合控件 38 3.7.1 createchildcontrols方法 39 3.7.2 childcontrolscreated属性 39 3.7.3 ensurechildcontrols方法 39 3.7.4 recreatechildcontrols方法 39 3.7.5 controls属性 40 3.7.6 hascontrols方法 40 3.7.7 hasevents方法 40 3.7.8 findcontrol方法 41 3.7.9 实现复合控件示例 41 3.8 常用开发技巧 51 3.8.1 designmode属性 51 3.8.2 屏蔽基类控件中的属性 52 3.8.3 page.request.browser属性 53 3.8.4 设置控件id规范 53 3.8.5 增强findcontrol功能 54 3.8.6 映射服务端控件值到客户端 55 3.8.7 禁止派生自compositecontrol的控件创建子控件 56 3.8.8 使用createchildcontrols的注意事项 56 3.8.9 不要误解设计元属性defaultvalue 57 3.8.10 在render方法中利用基类资源 57 3.8.11 条件编译&条件属性 60 3.9 本章总结 61 第4章 服务器控件属性 62 4.1 控件属性的作用 62 4.1.1 系统属性 62 4.1.2 自定义属性 62 4.2 简单属性 63 4.3 属性的设计特性 64 4.4 复杂属性 67 4.4.1 概述 67 4.4.2 复杂属性的几种标记形式 67 4.4.3 深入研究——复杂属性分析器 79 4.5 深入研究——定制自己的属性编辑器 85 4.5.1 系统属性编辑器 85 4.5.2 定制属性编辑器 91 4.6 类型转换器 126 4.6.1 系统类型转换器 126 4.6.2 定制自己的类型转换器 128 4.7 实现自定义属性 138 4.8 本章总结 145 第5章 事件和数据回发机制 146 5.1 控件事件和数据回发概述 146 5.1.1 事件及其意义 146 5.1.2 数据回发机制 147 5.2 事件和数据回发机制的实现 148 5.2.1 客户端回传事件接口ipostbackeventhandler 148 5.2.2 客户端回发/回调揭密 150 5.2.3 回传数据处理接口ipostbackdatahandler 153 5.2.4 正确处理继承基类中控件的事件 159 5.2.5 扩展kingtextbox控件功能(kingtextboxcanpostevent控件) 161 5.3 复合控件的事件处理机制 168 5.3.1 高效率事件集合对象 168 5.3.2 定制自己的委托和事件参数类 170 5.3.3 复合控件的事件处理 175 5.3.4 自动完成功能控件searchcontrolintelligent 185 5.4 本章总结 193 第6章 页面状态机制 194 6.1 页面状态概述 194 6.2 视图状态机制 195 6.2.1 istatemanager接口 195 6.2.2 控件生命周期中的装载和保存视图阶段 196 6.2.3 简单类型视图状态应用 197 6.2.4 实现自定义类型视图状态 205 6.3 控件状态机制 217 6.4 视图状态和控件状态的关系 221 6.4.1 在禁用视图状态的情况下仍然使用viewstate对象 221 6.4.2 istatemanager接口仍然可以在控件状态中使用 223 6.4.3 视图状态和控件状态组合使用规则 225 6.5 加密页面状态 225 6.6 清除页面状态 226 6.7 对动态添加控件的视图状态分析 228 6.8 自定义类型转换器实现高效率序列化 231 6.9 页面状态性能优化策略 238 6.9.1 存储位置优化——把视图状态信息保存在服务端而非客户端 238 6.9.2 体积优化——压缩视图状态数据 240 6.9.3 分块存储视图状态数据 243 6.10 视图状态和控件状态的总结 243 6.11 本章总结 244 第7章 定制自定义控件主题样式 245 7.1 控件样式概述 245 7.2 asp.net对样式的支持 245 7.2.1 style类的工作原理及使用 245 7.2.2 webcontrol基类对样式的支持功能及其工作原理 249 7.2.3 htmltextwriter类对控件样式的支持 252 7.2.4 定义控件内部的样式属性规则 253 7.2.5 两个常用转换方法 256 7.3 应用示例 260 7.3.1 复合控件样式及视图状态 260 7.3.2 控件结构与样式分离方案 268 7.4 本章总结 295 第8章 控件客户端编程模型 297 8.1 asp.net服务端控件对客户端的支持 297 8.2 clientscriptmanager类功能详解 301 8.2.1 registerarraydeclaration方法 301 8.2.2 registerclientscriptblock方法 302 8.2.3 registerclientscriptinclude方法 303 8.2.4 registerclientscriptresource方法 304 8.2.5 registerstartupscript方法 305 8.2.6 registerexpandoattribute方法 305 8.2.7 registerhiddenfield方法 306 8.2.8 getcallbackeventreference方法 307 8.2.9 getpostbackclienthyperlink方法 307 8.2.10 getpostbackeventreference方法 308 8.2.11 getwebresourceurl方法 308 8.2.12 registeronsubmitstatement方法 309 8.3 客户端回调 309 8.4 客户端控件应用示例 323 8.4.1 封装js客户端对象 323 8.4.2 封装htc客户端对象 343 8.4.3 在线签名控件示例应用 371 8.5 常用的一些javascript框架 385 8.6 本章总结 387 第9章 定制用户控件 388 9.1 用户控件概述 388 9.1.1 用户控件的作用.. 388 9.1.2 了解system.web.ui.usercontrol基类 388 9.2 用户控件应用示例 389 9.2.1 简单用户控件 389 9.2.2 复杂数据绑定用户控件 394 9.3 用户控件缓存 419 9.3.1 asp.net缓存介绍 419 9.3.2 用户控件缓存 420 9.4 本章总结 421 第10章 开发验证控件 422 10.1 验证控件的工作原理 422 10.1.1 内置验证控件简述 422 10.1.2 验证控件的工作机制解析 423 10.2 实现自定义验证控件 443 10.3 本章总结 451 第11章 在控件中使用嵌入资源 452 11.1 在控件中嵌入资源的原理 452 11.2 在控件中应用嵌入资源 453 11.2.1 在控件中使用嵌入资源 453 11.2.2 常用嵌入资源类型及用法 455 11.3 浏览器常用工具 460 11.3.1 httpwatch 460 11.3.2 ie develper toolbar 461 11.3.3 fiddler 461 11.4 本章总结 462 第12章 开发模板数据绑定控件 463 12.1 asp.net模板属性控件机制 463 12.1.1 模板属性介绍 463 12.1.2 asp.net对模板控件的支持 464 12.1.3 repeater控件模板实现机制解析 466 12.2 自定义控件应用示例 469 12.2.1 模板控件功能 469 12.2.2 应用示例 470 12.3 本章总结 489 第13章 数据绑定和数据源控件 490 13.1 数据绑定控件 490 13.1.1 数据绑定控件概述 490 13.1.2 asp.net对数据绑定控件的支持 491 13.2 数据绑定控件示例应用 501 13.2.1 控件实现功能 501 13.2.2 应用示例 502 13.3 数据源控件 508 13.3.1 数据源控件概述 508 13.3.2 asp.net对数据源控件的支持 508 13.4 数据源控件示例应用 515 13.4.1 控件实现功能 515 13.4.2 应用示例 516 13.5 本章总结 522 第14章 扩展控件方案——gridview 523 14.1 扩展控件概述 523 14.2 任意定制gridview多表头 523 14.2.1 功能概述 523 14.2.2 代码实现 524 14.3 固定gridview表头并增加滚动条支持 527 14.3.1 功能概述 527 14.3.2 代码实现 528 14.4 本章总结 533 第15章 自定义控件设计模式下编程汇总 534 15.1 .net框架对设计支持 534 15.2 设计元数据支持 535 15.3 复杂属性序列化 539 15.4 类型转换器 539 15.5 属性编辑器 540 15.6 设计模式可用基类介绍 541 15.7 设计对控件呈现的支持 543 15.7.1 概述 543 15.7.2 应用示例 543 15.8 自动套用格式 546 15.8.1 概述 546 15.8.2 应用示例 547 15.9 模板ui设计器 551 15.10 智能操作列表 552 15.10.1 概述 552 15.10.2 应用示例 552 15.11 控件设计器区域 558 15.11.1 概述 558 15.11.2 应用示例 558 15.12 本章总结 562 第16章 asp.net ajax控件开发——客户端 563 16.1 asp.net ajax框架概述 563 16.2 ajax library对客户端面向对象功能支持 564 16.2.1 命名空间及type和function类 565 16.2.2 接口类型 568 16.2.3 类类型以及面向对象继承特征 569 16.2.4 枚举类型 570 16.2.5 反射功能 570 16.3 ajax library中的常用类型 571 16.3.1 ajax library对javascript基类型的扩展 571 16.3.2 sys.stringbuilder类 576 16.4 ajax library请求服务端和webservices 577 16.4.1 sys.net命名空间中的类 577 16.4.2 请求过程解析 578 16.4.3 webrequest请求示例 579 16.4.4 使用代理实现ajax调用服务端示例 581 16.5 ajax library对控件客户端类开发的支持 584 16.5.1 客户端控件基成员(类/接口) 584 16.5.2 asp.net ajax控件客户端生命周期 589 16.6 客户端控件示例应用 592 16.7 调试和跟踪 603 16.8 本章总结 605 第17章 asp.net ajax控件开发——服务端 606 17.1 asp.net ajax服务器控件概述 606 17.2 ajax服务器控件 607 17.2.1 ajax服务器控件 607 17.2.2 asp.net ajax扩展程序控件 612 17.3 asp.net ajax对服务器控件支持的基类 612 17.3.1 ajax控件支持的基类 612 17.3.2 ajax控件应用示例 623 17.4 本章总结 636 附录a .net 3.5技术教程系列——collection/asp.net ajax/ silverlight/jquery ...646
内容简介   本书主要介绍asp.net的控件开发,书中通过70多个例子讲解了asp.net控件开发技术的各个方面,而且剖析了很多控件中系统基类源代码,读者从这些系统源代码可以体会设计模式思想。如果扎实地掌握了asp.net控件的运行机制,开发一个页面级的asp.net应用程序会变得非常简单。本书宗旨就是让开发人员真正理解asp.net技术,帮助开发人员提高asp.net开发的技术水平。学完本书后您不仅能够掌握控件开发各个方面的技术,而且深晓asp.net的工作原理。对大部分使用asp.net技术开发两年左右的开发人员来说,本书75%以上的内容可能没有接触过,本书将通过笔者精心准备的一些生动的例子来阐述这些内容。.    本书适合从事asp.net技术多年想往深度理解asp.net工作机制的开发人员阅读,对于刚刚入门的初级开发人员,本书的前面几章也介绍了几个入门性的应用例子,本书还可以作为在校学生的就业预备教材。针对读者安装的开发环境不同,笔者分别为vs 2005和vs 2008建立了解决方案,即无论您是使用vs 2005还是vs 2008都可以成功打开本书随书光盘的代码,只是使用vs 2005打开的解决方案不包含.net 3.5对应章节内容的示例代码。... 目录 第1章 服务器控件概述及开发环境部署.1 1.1 自定义服务器控件1 1.2 服务器控件在软件开发过程中的作用1 1.3 在控件开发中提升自己2 1.4 可继承控件基类介绍2 1.5 运行一个简单的控件7 1.5.1 开发一个简单控件7 1.5.2 部署和运行11 1.6 控件生命周期12 1.6.1 概述12 1.6.2 用代码跟踪控件生命周期过程14 1.7 本章总结17 第2章 服务器控件开发中的调试技术18 2.1 预置代码示例18 2.2 调试页面服务端代码19 2.3 服务器控件的调试20 2.3.1 运行模式下的调试方法20 2.3.2 设计模式下的调试方法20 2.4 javascript脚本调试方法22 2.4.1 调试页面中的javascript脚本(方法一)22 .2.4.2 调试页面中的javascript脚本(方法二)23 2.4.3 调试非嵌入式javascript脚本文件23 2.4.4 调试嵌入式javascript脚本资源文件24 2.4.5 高效率调试的技巧24 2.5 ajax library对javascript调试支持26 2.6 本章总结26 第3章 从零开始开发服务器控件27 3.1 选择基类27 3.2 控件呈现顺序28 3.3 render呈现控件的几种方式30 3.3.1 使用htmltextwriter类输出30 3.3.2 直接输出html标签32 3.3.3 使用服务器控件的rendercontrol方法33 3.4 addattributestorender方法34 3.5 createchildcontrols方法35 3.6 inamingcontainer接口36 3.7 实现复合控件38 3.7.1 createchildcontrols方法39 3.7.2 childcontrolscreated属性39 3.7.3 ensurechildcontrols方法39 3.7.4 recreatechildcontrols方法39 3.7.5 controls属性40 3.7.6 hascontrols方法40 3.7.7 hasevents方法40 3.7.8 findcontrol方法41 3.7.9 实现复合控件示例41 3.8 常用开发技巧51 3.8.1 designmode属性51 3.8.2 屏蔽基类控件中的属性52 3.8.3 page.request.browser属性53 3.8.4 设置控件id规范53 3.8.5 增强findcontrol功能54 3.8.6 映射服务端控件值到客户端55 3.8.7 禁止派生自compositecontrol的控件创建子控件56 3.8.8 使用createchildcontrols的注意事项56 3.8.9 不要误解设计元属性defaultvalue57 3.8.10 在render方法中利用基类资源57 3.8.11 条件编译&条件属性60 3.9 本章总结61 第4章 服务器控件属性62 4.1 控件属性的作用62 4.1.1 系统属性62 4.1.2 自定义属性62 4.2 简单属性63 4.3 属性的设计特性64 4.4 复杂属性67 4.4.1 概述67 4.4.2 复杂属性的几种标记形式67 4.4.3 深入研究——复杂属性分析器79 4.5 深入研究——定制自己的属性编辑器85 4.5.1 系统属性编辑器85 4.5.2 定制属性编辑器91 4.6 类型转换器126 4.6.1 系统类型转换器126 4.6.2 定制自己的类型转换器128 4.7 实现自定义属性138 4.8 本章总结145 第5章 事件和数据回发机制146 5.1 控件事件和数据回发概述146 5.1.1 事件及其意义146 5.1.2 数据回发机制147 5.2 事件和数据回发机制的实现148 5.2.1 客户端回传事件接口ipostbackeventhandler148 5.2.2 客户端回发/回调揭密150 5.2.3 回传数据处理接口ipostbackdatahandler153 5.2.4 正确处理继承基类中控件的事件159 5.2.5 扩展kingtextbox控件功能(kingtextboxcanpostevent控件)161 5.3 复合控件的事件处理机制168 5.3.1 高效率事件集合对象168 5.3.2 定制自己的委托和事件参数类170 5.3.3 复合控件的事件处理175 5.3.4 自动完成功能控件searchcontrolintelligent185 5.4 本章总结193 第6章 页面状态机制194 6.1 页面状态概述194 6.2 视图状态机制195 6.2.1 istatemanager接口195 6.2.2 控件生命周期中的装载和保存视图阶段196 6.2.3 简单类型视图状态应用197 6.2.4 实现自定义类型视图状态205 6.3 控件状态机制217 6.4 视图状态和控件状态的关系221 6.4.1 在禁用视图状态的情况下仍然使用viewstate对象221 6.4.2 istatemanager接口仍然可以在控件状态中使用223 6.4.3 视图状态和控件状态组合使用规则225 6.5 加密页面状态225 6.6 清除页面状态226 6.7 对动态添加控件的视图状态分析228 6.8 自定义类型转换器实现高效率序列化231 6.9 页面状态性能优化策略238 6.9.1 存储位置优化——把视图状态信息保存在服务端而非客户端238 6.9.2 体积优化——压缩视图状态数据240 6.9.3 分块存储视图状态数据243 6.10 视图状态和控件状态的总结243 6.11 本章总结244 第7章 定制自定义控件主题样式245 7.1 控件样式概述245 7.2 asp.net对样式的支持245 7.2.1 style类的工作原理及使用245 7.2.2 webcontrol基类对样式的支持功能及其工作原理249 7.2.3 htmltextwriter类对控件样式的支持252 7.2.4 定义控件内部的样式属性规则253 7.2.5 两个常用转换方法256 7.3 应用示例260 7.3.1 复合控件样式及视图状态260 7.3.2 控件结构与样式分离方案268 7.4 本章总结295 第8章 控件客户端编程模型297 8.1 asp.net服务端控件对客户端的支持297 8.2 clientscriptmanager类功能详解301 8.2.1 registerarraydeclaration方法301 8.2.2 registerclientscriptblock方法302 8.2.3 registerclientscriptinclude方法303 8.2.4 registerclientscriptresource方法304 8.2.5 registerstartupscript方法305 8.2.6 registerexpandoattribute方法305 8.2.7 registerhiddenfield方法306 8.2.8 getcallbackeventreference方法307 8.2.9 getpostbackclienthyperlink方法307 8.2.10 getpostbackeventreference方法308 8.2.11 getwebresourceurl方法308 8.2.12 registeronsubmitstatement方法309 8.3 客户端回调309 8.4 客户端控件应用示例323 8.4.1 封装js客户端对象323 8.4.2 封装htc客户端对象343 8.4.3 在线签名控件示例应用371 8.5 常用的一些javascript框架385 8.6 本章总结387 第9章 定制用户控件388 9.1 用户控件概述388 9.1.1 用户控件的作用..388 9.1.2 了解system.web.ui.usercontrol基类388 9.2 用户控件应用示例389 9.2.1 简单用户控件389 9.2.2 复杂数据绑定用户控件394 9.3 用户控件缓存419 9.3.1 asp.net缓存介绍419 9.3.2 用户控件缓存420 9.4 本章总结421 第10章 开发验证控件422 10.1 验证控件的工作原理422 10.1.1 内置验证控件简述422 10.1.2 验证控件的工作机制解析423 10.2 实现自定义验证控件443 10.3 本章总结451 第11章 在控件中使用嵌入资源452 11.1 在控件中嵌入资源的原理452 11.2 在控件中应用嵌入资源453 11.2.1 在控件中使用嵌入资源453 11.2.2 常用嵌入资源类型及用法455 11.3 浏览器常用工具460 11.3.1 httpwatch460 11.3.2 ie develper toolbar461 11.3.3 fiddler461 11.4 本章总结462 第12章 开发模板数据绑定控件463 12.1 asp.net模板属性控件机制463 12.1.1 模板属性介绍463 12.1.2 asp.net对模板控件的支持464 12.1.3 repeater控件模板实现机制解析466 12.2 自定义控件应用示例469 12.2.1 模板控件功能469 12.2.2 应用示例470 12.3 本章总结489 第13章 数据绑定和数据源控件490 13.1 数据绑定控件490 13.1.1 数据绑定控件概述490 13.1.2 asp.net对数据绑定控件的支持491 13.2 数据绑定控件示例应用501 13.2.1 控件实现功能501 13.2.2 应用示例502 13.3 数据源控件508 13.3.1 数据源控件概述508 13.3.2 asp.net对数据源控件的支持508 13.4 数据源控件示例应用515 13.4.1 控件实现功能515 13.4.2 应用示例516 13.5 本章总结522 第14章 扩展控件方案——gridview523 14.1 扩展控件概述523 14.2 任意定制gridview多表头523 14.2.1 功能概述523 14.2.2 代码实现524 14.3 固定gridview表头并增加滚动条支持527 14.3.1 功能概述527 14.3.2 代码实现528 14.4 本章总结533 第15章 自定义控件设计模式下编程汇总534 15.1 .net框架对设计支持534 15.2 设计元数据支持535 15.3 复杂属性序列化539 15.4 类型转换器539 15.5 属性编辑器540 15.6 设计模式可用基类介绍541 15.7 设计对控件呈现的支持543 15.7.1 概述543 15.7.2 应用示例543 15.8 自动套用格式546 15.8.1 概述546 15.8.2 应用示例547 15.9 模板ui设计器551 15.10 智能操作列表552 15.10.1 概述552 15.10.2 应用示例552 15.11 控件设计器区域558 15.11.1 概述558 15.11.2 应用示例558 15.12 本章总结562 第16章 asp.net ajax控件开发——客户端563 16.1 asp.net ajax框架概述563 16.2 ajax library对客户端面向对象功能支持564 16.2.1 命名空间及type和function类565 16.2.2 接口类型568 16.2.3 类类型以及面向对象继承特征569 16.2.4 枚举类型570 16.2.5 反射功能570 16.3 ajax library中的常用类型571 16.3.1 ajax library对javascript基类型的扩展571 16.3.2 sys.stringbuilder类576 16.4 ajax library请求服务端和webservices577 16.4.1 sys.net命名空间中的类577 16.4.2 请求过程解析578 16.4.3 webrequest请求示例579 16.4.4 使用代理实现ajax调用服务端示例581 16.5 ajax library对控件客户端类开发的支持584 16.5.1 客户端控件基成员(类/接口)584 16.5.2 asp.net ajax控件客户端生命周期589 16.6 客户端控件示例应用592 16.7 调试和跟踪603 16.8 本章总结605 第17章 asp.net ajax控件开发——服务端606 17.1 asp.net ajax服务器控件概述606 17.2 ajax服务器控件607 17.2.1 ajax服务器控件607 17.2.2 asp.net ajax扩展程序控件612 17.3 asp.net ajax对服务器控件支持的基类612 17.3.1 ajax控件支持的基类612 17.3.2 ajax控件应用示例623 17.4 本章总结636
第1章 服务器控件概述及开发环境部署 .1 1.1 自定义服务器控件 1 1.2 服务器控件在软件开发过程中的作用 1 1.3 在控件开发中提升自己 2 1.4 可继承控件基类介绍 2 1.5 运行一个简单的控件 7 1.5.1 开发一个简单控件 7 1.5.2 部署和运行 11 1.6 控件生命周期 12 1.6.1 概述 12 1.6.2 用代码跟踪控件生命周期过程 14 1.7 本章总结 17 第2章 服务器控件开发中的调试技术 18 2.1 预置代码示例 18 2.2 调试页面服务端代码 19 2.3 服务器控件的调试 20 2.3.1 运行模式下的调试方法 20 2.3.2 设计模式下的调试方法 20 2.4 javascript脚本调试方法 22 2.4.1 调试页面中的javascript脚本(方法一) 22 .2.4.2 调试页面中的javascript脚本(方法二) 23 2.4.3 调试非嵌入式javascript脚本文件 23 2.4.4 调试嵌入式javascript脚本资源文件 24 2.4.5 高效率调试的技巧 24 2.5 ajax library对javascript调试支持 26 2.6 本章总结 26 第3章 从零开始开发服务器控件 27 3.1 选择基类 27 3.2 控件呈现顺序 28 3.3 render呈现控件的几种方式 30 3.3.1 使用htmltextwriter类输出 30 3.3.2 直接输出html标签 32 3.3.3 使用服务器控件的rendercontrol方法 33 3.4 addattributestorender方法 34 3.5 createchildcontrols方法 35 3.6 inamingcontainer接口 36 3.7 实现复合控件 38 3.7.1 createchildcontrols方法 39 3.7.2 childcontrolscreated属性 39 3.7.3 ensurechildcontrols方法 39 3.7.4 recreatechildcontrols方法 39 3.7.5 controls属性 40 3.7.6 hascontrols方法 40 3.7.7 hasevents方法 40 3.7.8 findcontrol方法 41 3.7.9 实现复合控件示例 41 3.8 常用开发技巧 51 3.8.1 designmode属性 51 3.8.2 屏蔽基类控件中的属性 52 3.8.3 page.request.browser属性 53 3.8.4 设置控件id规范 53 3.8.5 增强findcontrol功能 54 3.8.6 映射服务端控件值到客户端 55 3.8.7 禁止派生自compositecontrol的控件创建子控件 56 3.8.8 使用createchildcontrols的注意事项 56 3.8.9 不要误解设计元属性defaultvalue 57 3.8.10 在render方法中利用基类资源 57 3.8.11 条件编译&条件属性 60 3.9 本章总结 61 第4章 服务器控件属性 62 4.1 控件属性的作用 62 4.1.1 系统属性 62 4.1.2 自定义属性 62 4.2 简单属性 63 4.3 属性的设计特性 64 4.4 复杂属性 67 4.4.1 概述 67 4.4.2 复杂属性的几种标记形式 67 4.4.3 深入研究——复杂属性分析器 79 4.5 深入研究——定制自己的属性编辑器 85 4.5.1 系统属性编辑器 85 4.5.2 定制属性编辑器 91 4.6 类型转换器 126 4.6.1 系统类型转换器 126 4.6.2 定制自己的类型转换器 128 4.7 实现自定义属性 138 4.8 本章总结 145 第5章 事件和数据回发机制 146 5.1 控件事件和数据回发概述 146 5.1.1 事件及其意义 146 5.1.2 数据回发机制 147 5.2 事件和数据回发机制的实现 148 5.2.1 客户端回传事件接口ipostbackeventhandler 148 5.2.2 客户端回发/回调揭密 150 5.2.3 回传数据处理接口ipostbackdatahandler 153 5.2.4 正确处理继承基类中控件的事件 159 5.2.5 扩展kingtextbox控件功能(kingtextboxcanpostevent控件) 161 5.3 复合控件的事件处理机制
web项目中,页面缓存清除是指从浏览器缓存中删除已缓存的页面数据,以便在下次访问相同页面重新获取最新版本的页面内容。这样可以保证用户能够看到最新的页面展示,而不是过缓存数据。 传统的做法是通过手动刷新浏览器清除页面缓存,但这种方法需要用户主动操作,不够便捷。为了解决这个问题,我们可以借助一些技术手段,实现自动清除页面缓存,而不需要每次刷新浏览器。 一种常见的方法是在网页的URL中加入一个间戳或版本号参数。当页面内容发生改变,例如更新了CSS样式或JS脚本,我们可以通过修改URL中的间戳或版本号,使浏览器认为该页面是一个新的资源,从而强制重新加载页面内容。 另一种方法是使用HTTP响应头中的Cache-Control和Expires字段。通过设置这些字段的值为0或一个未来的日期,我们可以指示浏览器在访问该页面不要使用缓存,而总是重新从服务器获取最新的页面内容。 除了以上两种方法,我们还可以使用一些前端开发框架或工具,如React、Angular或Vue.js等,在开发过程中自动处理页面的缓存清除。这些框架通常具有自动或手动的缓存清除机制,可以根据开发者的需求灵活配置。 总结来说,为了实现页面缓存清除,不需要每次刷新浏览器,我们可以通过在URL中添加间戳或版本号参数、为HTTP响应头定义适当的缓存控制字段、或使用前端开发框架来自动处理缓存清除。这些方法都可以确保用户在访问web项目能够得到最新的页面内容,提供更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

几何心凉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值