[索引页]
[源码下载]

精进不休 .NET 4.0 (2) - asp.net 4.0 新特性之url路由, 自定义CacheProvider, 新增的表达式<%: expression %>, QueryExtender控件, 其它新特性

作者:webabcd

介绍
asp.net 4.0 的新增功能

  • 在 web form 中做 url 路由
  • 通过实现自定义的 CacheProvider ,来实现自定义的页面缓存逻辑
  • 新增的表达式 <%: expression %> 相当于 <%= HttpUtility.HtmlEncode(expression) %>
  • 控件 QueryExtender,对数据源控件获得的数据做再检索
  • 其它新特性

示例
1、web form 中的 url 路由的 demo
Global.asax.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Security; 
using System.Web.SessionState;

using System.Web.Routing;

namespace AspDotNet 

        public class Global : System.Web.HttpApplication 
        { 
void Application_Start() void Application_Start(object sender, EventArgs e) 
                { 
                        // 关于 Routing 可以参考以前写的 http://webabcd.blog.51cto.com/1787395/341116 
                        // 其中 PageRouteHandler 类的作用是将 URL 路由的功能集成到 Web Form 中 
                        RouteTable.Routes.Add("myRoute", new Route("user/{userName}/{age}", new PageRouteHandler("~/UrlRouting/Default.aspx")));

/* 对应的配置如下,在 machine.config 中 
                        <system.web> 
                             <httpmodule> 
                                        <add name="RoutingModule" type="System.Web.Routing.UrlRoutingModule"/>    
                             </httpmodule> 
                        <system.web> 
                         */ 
                } 
        } 
}

UrlRouting/Default.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" 
        CodeBehind="Default.aspx.cs" Inherits="AspDotNet.UrlRouting.Default" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"> 
        <!-- 
                在页面上获取 url 路由而来的数据的方法 
                配合以下逻辑的路由规则是:"user/{userName}/{age}" 
        --> 
        <asp:Literal runat="server" Text="<%$ RouteValue:userName%>" /> 
        <br /> 
        <asp:Literal runat="server" Text="<%$ RouteValue:age%>" />

<!-- 
                另外,对于数据源控件来说,也多了一种参数类型 RouteParameter    
        --> 
</asp:Content> 
<%-- 
对应的配置如下,在 machine.config 中 
<system.web> 
     <compilation debug="true" targetFrameworkMoniker=".NETFramework,Version=v4.0"> 
            <expressionBuilders> 
                 <add expressionPrefix="RouteValue" type="System.Web.Compilation.RouteValueExpressionBuilder" /> 
            </expressionBuilders> 
     </compilation> 
<system.web> 
--%>

UrlRouting/Default.aspx.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls;

namespace AspDotNet.UrlRouting 

        public partial class Default : System.Web.UI.Page 
        { 
void Page_Load() void Page_Load(object sender, EventArgs e) 
                { 
                        // 获取 url 路由而来的数据 
                        // 配合以下逻辑的路由规则是:"user/{userName}/{age}" 
                        Response.Write("userName: " + RouteData.Values["userName"].ToString()); 
                        Response.Write("<br />"); 
                        Response.Write("age: " + RouteData.Values["age"].ToString()); 
                } 
        } 
}

UrlRouting/RouteUrlExpressionBuilderDemo.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" 
        CodeBehind="RouteUrlExpressionBuilderDemo.aspx.cs" Inherits="AspDotNet.UrlRouting.RouteUrlExpressionBuilderDemo" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"> 
        <!-- 
                在页面上构造 url 路由的方式 
        --> 
        <asp:HyperLink ID="lnk1" runat="server" NavigateUrl="<%$ RouteUrl:RouteName=myRoute, userName=webabcd, age=30 %>" 
                Text="goto" /> 
        <br /><br /> 
        <asp:HyperLink ID="lnk2" runat="server" Text="goto" /> 
</asp:Content> 
<%-- 
对应的配置如下,在 machine.config 中 
<system.web> 
     <compilation debug="true" targetFrameworkMoniker=".NETFramework,Version=v4.0"> 
            <expressionBuilders> 
                 <add expressionPrefix="RouteUrl" type="System.Web.Compilation.RouteUrlExpressionBuilder"/> 
            </expressionBuilders> 
     </compilation> 
<system.web> 
--%>

UrlRouting/RouteUrlExpressionBuilderDemo.aspx.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls;

using System.Web.Compilation;

namespace AspDotNet.UrlRouting 

        public partial class RouteUrlExpressionBuilderDemo : System.Web.UI.Page 
        { 
void Page_Load() void Page_Load(object sender, EventArgs e) 
                { 
                        // 在代码中构造 url 路由的方式 
                        string expression = String.Format("RouteName={0}, userName={1}, age={2}", "myRoute", "webabcd", "30"); 
                        lnk2.NavigateUrl = RouteUrlExpressionBuilder.GetRouteUrl(this, expression); 
                } 
        } 
}

2、自定义 CacheProvider
CachingEnhancement.aspx
<%-- OutputCache 目前不支持直接设置 providerName 属性 --%> 
<%@ OutputCache Duration="30" VaryByParam="None" %>

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" 
        CodeBehind="CachingEnhancement.aspx.cs" Inherits="AspDotNet.CachingEnhancement" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"> 
        <%= DateTime.Now.ToString() %> 
</asp:Content>

CachingEnhancement.aspx.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls;

using System.Web.Caching; 
using System.Security.Cryptography; 
using System.Text; 
using System.IO; 
using System.Runtime.Serialization.Formatters.Binary;

namespace AspDotNet 

        public partial class CachingEnhancement : System.Web.UI.Page 
        { 
void Page_Load() void Page_Load(object sender, EventArgs e) 
                { 
                         
                } 
        }

// 重写 OutputCacheProvider 抽象类,以实现自定义的缓存实现(需要重写的方法是 Add, Get, Remove, Set) 
        // 本 Demo 演示了,如何开发一个自定义的 CacheProvider,来实现将数据缓存到硬盘的功能 
        public class FileCacheProvider : OutputCacheProvider 
        { 
                private string _cachePathPrefix = @"c:\";

string MD5() string MD5(string s) 
                { 
                        var provider = new MD5CryptoServiceProvider(); 
                        var bytes = Encoding.UTF8.GetBytes(s); 
                        var builder = new StringBuilder();

bytes = provider.ComputeHash(bytes);

foreach (var b in bytes) 
                                builder.Append(b.ToString("x2").ToLower());

return builder.ToString(); 
                }

/// <summary> 
                /// 将指定的 key ,做md5 加密后,拼出一个路径,做为保存此 key 对应的对象的文件(此例只做演示用) 
                /// </summary> 
                /// <param name="key">缓存 key</param> 
                /// <returns></returns> 
string GetPathFromKey() string GetPathFromKey(string key) 
                { 
                        return _cachePathPrefix + MD5(key) + ".txt"; 
                }

/// <summary> 
                /// 将对象放入自定义的缓存中 
                /// </summary> 
                /// <param name="key">缓存 key</param> 
                /// <param name="entry">缓存对象</param> 
                /// <param name="utcExpiry">缓存的过期时间</param> 
                /// <returns></returns> 
override object Add() override object Add(string key, object entry, DateTime utcExpiry) 
                { 
                        var path = GetPathFromKey(key);

// 指定的 key 已被缓存了,则不做任何处理 
                        if (File.Exists(path)) 
                                return entry;

// 将对象缓存到硬盘上的指定文件 
                        using (var file = File.OpenWrite(path)) 
                        { 
                                var item = new CacheItem { Expires = utcExpiry, Item = entry }; 
                                var formatter = new BinaryFormatter(); 
                                formatter.Serialize(file, item); 
                        }

return entry; 
                }

/// <summary> 
                /// 在缓存中,根据指定的 key 获取缓存对象 
                /// </summary> 
                /// <param name="key">缓存 key</param> 
                /// <returns></returns> 
override object Get() override object Get(string key) 
                { 
                        var path = GetPathFromKey(key);

// 未找到缓存 
                        if (!File.Exists(path)) 
                                return null;

CacheItem item = null;

// 如果有缓存的话,则取出缓存对象 
                        using (var file = File.OpenRead(path)) 
                        { 
                                var formatter = new BinaryFormatter(); 
                                item = (CacheItem)formatter.Deserialize(file); 
                        }

// 缓存过期或缓存中无数据,则删除此缓存所对应的硬盘上的物理文件 
                        if (item == null || item.Expires <= DateTime.Now.ToUniversalTime()) 
                        { 
                                Remove(key); 
                                return null; 
                        }

return item.Item; 
                }

/// <summary> 
                /// 根据指定的 key 删除缓存对象 
                /// </summary> 
                /// <param name="key">缓存 key</param> 
override void Remove() override void Remove(string key) 
                { 
                        var path = GetPathFromKey(key);

if (File.Exists(path)) 
                                File.Delete(path); 
                }

/// <summary> 
                /// 更新缓存 
                /// </summary> 
                /// <param name="key">缓存 key</param> 
                /// <param name="entry">缓存对象</param> 
                /// <param name="utcExpiry">缓存的过期时间</param> 
override void Set() override void Set(string key, object entry, DateTime utcExpiry) 
                { 
                        var item = new CacheItem { Expires = utcExpiry, Item = entry }; 
                        var path = GetPathFromKey(key);

using (var file = File.OpenWrite(path)) 
                        { 
                                var formatter = new BinaryFormatter(); 
                                formatter.Serialize(file, item); 
                        } 
                }

/// <summary> 
                /// 封装了需要被缓存的对象的一个可序列化的对象 
                /// </summary> 
                [Serializable] 
                internal class CacheItem 
                { 
                        /// <summary> 
                        /// 缓存对象 
                        /// </summary> 
                        public object Item; 
                         
                        /// <summary> 
                        /// 缓存对象的过期时间 
                        /// </summary> 
                        public DateTime Expires; 
                } 
        } 
}

Web.config
<!--缓存配置--> 
<caching> 
        <!--默认的缓存实现是 AspNetInternalProvider(即 asp.net 自带的基于内存的缓存实现方式)--> 
        <outputCache defaultProvider="AspNetInternalProvider"> 
                <providers> 
                        <!-- 
                                新增一个缓存的 provider 配置 
                                具体实现见 CachingEnhancement.aspx.cs 
                        --> 
                        <add name="FileCache" type="AspDotNet.FileCacheProvider, AspDotNet"/> 
                </providers> 
        </outputCache> 
</caching>
Global.asax.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Security; 
using System.Web.SessionState;

using System.Web.Routing;

namespace AspDotNet 

        public class Global : System.Web.HttpApplication 
        { 
                // 根据 HttpContext 的不同,可以为其指定不同的 CacheProvider 
override string GetOutputCacheProviderName() override string GetOutputCacheProviderName(HttpContext context) 
                { 
                        // 符合此条件的,则缓存的实现使用自定义的 FileCacheProvider 
                        // 自定义缓存实现见 CachingEnhancement.aspx.cs 
                        // CacheProvider 的配置见 web.config 
                        // 页面的缓存时间见 CachingEnhancement.aspx 
                        if (context.Request.Path.ToLower().EndsWith("cachingenhancement.aspx")) 
                                return "FileCache"; 
                        else 
                                return base.GetOutputCacheProviderName(context); 
                } 
        } 
}

3、表达式 <%: expression %> 的 demo
HtmlEncodedCodeExpressions.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" 
        CodeBehind="HtmlEncodedCodeExpressions.aspx.cs" Inherits="AspDotNet.HtmlEncodedCodeExpressions" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"> 
         
        <%-- 
                新增的一个表达式 <%: expression %> 相当于 <%= HttpUtility.HtmlEncode(expression) %> 
        --%>

<%= "<strong>strong</strong>" %> 
        <br /> 
        <%: "<strong>strong</strong>" %> 
        <br /> 
        <%= HttpUtility.HtmlEncode("<strong>strong</strong>") %>

</asp:Content>

4、QueryExtender 控件的 demo
QueryExtenderDemo.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" 
        CodeBehind="QueryExtenderDemo.aspx.cs" Inherits="AspDotNet.QueryExtenderDemo" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"> 
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="LinqDataSource1"> 
                <Columns> 
                        <asp:BoundField DataField="ProductId" HeaderText="ProductId" SortExpression="ProductId" /> 
                        <asp:BoundField DataField="ProductName" HeaderText="ProductName" SortExpression="ProductName" /> 
                        <asp:BoundField DataField="ProductPrice" HeaderText="ProductPrice" SortExpression="ProductPrice" /> 
                </Columns> 
        </asp:GridView> 
        <asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="AspDotNet.QueryExtenderDemo" 
                EntityTypeName="AspDotNet.Product" TableName="Data"> 
        </asp:LinqDataSource>

<!-- 
                QueryExtender - 和数据源控件结合使用,以对数据源控件中检索到的数据做再次检索 
                        SearchExpression - 根据指定的字段查找指定的数据 
                        RangeExpression - 在指定字段中查找指定范围的数据 
                        PropertyExpression - 查找某字段的值为某指定的值的数据 
                        OrderByExpression - 用于排序数据 
                        CustomExpression - 自定义查询表达式 
        --> 
        <asp:QueryExtender ID="QueryExtender1" runat="server" TargetControlID="LinqDataSource1"> 
                <asp:SearchExpression DataFields="ProductName" SearchType="EndsWith"> 
                        <asp:Parameter Type="String" DefaultValue="0" /> 
                </asp:SearchExpression> 
        </asp:QueryExtender> 
</asp:Content>

QueryExtenderDemo.aspx.cs
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls;

namespace AspDotNet 

        public partial class QueryExtenderDemo : System.Web.UI.Page 
        { 
void Page_Load() void Page_Load(object sender, EventArgs e) 
                {

}

// 为 GridView 提供数据 
                public List<Product> Data 
                { 
                        get 
                        { 
                                Random random = new Random();

List<Product> products = new List<Product>(); 
                                for (int i = 0; i < 100; i++) 
                                { 
                                        products.Add(new Product { ProductId = i + 1, ProductName = "名称" + i.ToString().PadLeft(2, '0'), ProductPrice = random.NextDouble() }); 
                                }

return products; 
                        } 
                }

// 为 GridView 提供数据的实体类 
                public class Product 
                { 
                        public int ProductId { get; set; } 
                        public string ProductName { get; set; } 
                        public double ProductPrice { get; set; } 
                } 
        } 
}

5、其他新特性的简单说明
Others.aspx
<%@ Page Title="其它,一笔带过" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" 
        CodeBehind="Others.aspx.cs" Inherits="AspDotNet.Others" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 
        <style> 
                body 
                { 
                        font-size: 12px; 
                } 
                textarea 
                { 
                        width: 99%; 
                } 
        </style> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"> 
        <p> 
                1、Permanent Redirect - 可以实现 301 跳转 
                <ul> 
                        <li>Response.RedirectPermanent() - 永久性重定向(http 301)。</li> 
                        <li>Response.Redirect() - 临时性重定向(http 302)。</li> 
                </ul> 
        </p> 
        <p> 
                2、Session 压缩(设置 sessionState 节点的 compressionEnabled 属性) 
                <br /> 
                对于使用进程外会话状态服务器的会话状态提供程序,或者将会话状态保存在 sqlserver 数据库中的会话状态提供程序,现在为提高其效率新增了压缩 Session 数据的功能(使用System.IO.Compression.GZipStream来压缩数据),像如下这样的配置 
                <br /> 
                <textarea rows="6"> 
                        <sessionState 
                            mode="SqlServer" 
                            sqlConnectionString="data source=dbserver;Initial Catalog=aspnetstate" 
                            allowCustomSqlDatabase="true" 
                            compressionEnabled="true" 
                        /> 
                </textarea> 
        </p> 
        <p> 
                3、httpRuntime 节点的新增配置 
                <ul> 
                        <li>maxRequestPathLength - url 路径的最大长度(基于NTFS文件路径的最大长度就是 260)</li> 
                        <li>maxQueryStringLength - url 的最大长度</li> 
                        <li>requestPathInvalidChars - 指定 url 路径的无效字符</li> 
                        <li>requestValidationType - 继承 System.Web.Util.RequestValidator 抽象类,重写其 IsValidRequestString() 方法,以实现自定义的请求验证。在 requestValidationType 可以指定使用这个自定义的类</li> 
                        <li>encoderType - 重写 System.Web.Util.HttpEncoder,可以实现自定义的 html编码, url编码, http header编码。在 encoderType 指定这个自定义编码的类后,程序中所用到的 System.Web.HttpUtility 或 System.Web.HttpServerUtility 的相关方法将会使用自定义的编码实现</li> 
                </ul> 
                <br /> 
                <textarea rows="2"> 
                        <httpRuntime maxRequestPathLength="260" maxQueryStringLength="2048" requestPathInvalidChars="<,>,*,%,&,:,\,?" requestValidationType="Samples.MyValidator, Samples" encoderType="Samples.MyEncoder, Samples" /> 
                </textarea> 
        </p> 
        <p> 
                4、compilation 节点新增 targetFramework 属性,用于指定程序运行的目标框架 
                <br /> 
                <textarea> 
                        <compilation targetFramework="4.0" /> 
                </textarea> 
        </p> 
        <p> 
                5、asp.net 4.0 结合 iis 7.5 可使 web 应用程序自动启动 
                <br /> 
                在 web 程序中实现 System.Web.Hosting.IProcessHostPreloadClient 接口,用于被 iis 启动 
        </p> 
        <p> 
                6、Page 类中新增了两个属性,分别是 MetaDescription 和 MetaKeywords 
        </p> 
        <p> 
                7、以前每个可显示的控件都有 Enabled 属性(如果 Enabled="false" 则对应的 HTML 为 disabled="disabled"),但是 HTML 4.01 的标准是只有 input 才能有 disabled 属性 
                <ul> 
                        <li> 
                                在 pages 节点中设置 controlRenderingCompatibilityVersion="3.5",则所有可显示控件都会输出 disabled="disabled" 
                        </li> 
                        <li> 
                                在 pages 节点中设置 controlRenderingCompatibilityVersion="4.0",则只有 input 元素才会输出 disabled="disabled",非 input 元素将会自动标记一个名为 aspnetdisabled 的 css 类 
                        </li> 
                </ul> 
        </p> 
        <p> 
                8、web form 需要在页面上写入隐藏域(如为了保存 ViewState 的隐藏域),在 asp.net 4.0 中系统将在这类的隐藏域外的 div 上标记一个名为 aspNetHidden 的 css 类,以方便样式控制 
        </p> 
        <p> 
                9、ASP.NET Chart Control - 实例参考 http://code.msdn.microsoft.com/mschart 
        </p> 
</asp:Content>

OK 
[源码下载]
     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/341124,如需转载请自行联系原作者

精进不休 .NET 4.0 (2) - asp.net 4.0 新特性之url路由相关推荐

  1. WCF4.0新特性体验(6):路由服务Routing Service(下)

    紧接前文WCF4.0新特性体验(5):路由服务Routing Service(上).今天我们介绍WCF4.0消息路由的实现机制,然后会讲解路由服务的实现过程. [4]WCF与路由服务: 其实在介绍WC ...

  2. ASP.NET 3.5 新特性开发向导实践(附项目源码下载)

    ASP.NET 3.5 新特性开发向导实践(附项目源码下载) 本篇文章将演示ASP.NET 3.5 部分新功能.新特性,包括LINQ.ListView控件.LinqDataSource.DataPag ...

  3. Swift 2.0初探:值得注意的新特性

    转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上A ...

  4. MySQL 8.0 在关系数据库方面有这些新特性

    作者 | 捏造的信仰 原文 | https://segmentfault.com/a/1190000013803247 本文介绍几个 8.0 在关系数据库方面的主要新特性. 你可能已经知道 MySQL ...

  5. accept 返回0_从0开始理解Vite的主要新特性(一)

    此文已同步到公众号[因卓诶]以及因卓诶博客: 从0开始理解Vite的主要新特性(一) - 因卓诶-爱分享爱原创的技术博客 ~ 个人博客​www.yinzhuoei.com vite这个工具确实尤大在微 ...

  6. Kafka 2.8.0 正式发布,增加了哪些新特性?

    导读:目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐.可持久化.可水平扩展.支持流数据处理等多种特性而被广泛使用.目前越来越多的开源分布式处理系统如 Cloudera.Storm.Sp ...

  7. Asp.net 1.0 升级至 ASP.NET 2.0十个问题总结

    1.Global.asax文件的处理形式不一样 转化后将出现错误,在vs2003中Global.asax具有代码后置文件,2.0下, 将代码分离文件移到 App_Code 目录下,以便使其自动变为可通 ...

  8. Asp.net1.0 升级 ASP.NET 2.0 的几个问题总结

    这几天升级了一下原来的1.1项目,发现了一些问题,总结一下放在这里,也提醒还没有来得及升级或准备升级的朋友,升级的过程中少走弯路,少浪费时间. 1.Global.asax文件的处理形式不一样,转化后将 ...

  9. C#8.0的两个有趣的新特性以及gRPC

    最近每天忙着跑很多地方,回家就不想动了,没什么心情写东西.今天有空,稍微写一点. 下文中: 关于C#语法特性的部分需要Visual Studio 2019支持. 关于.NET Core的部分需要安装. ...

最新文章

  1. 理想L2辅助驾驶都撞车了,特斯拉的L5之梦怎么办?
  2. 欧文分校计算机新sat多少分录取,加州大学欧文分校SAT成绩要求是多少?
  3. Java中带标签的break,continue
  4. 全栈深度学习第6期: 模型测试和部署
  5. 促销海报灵感素材,不卖出去都难
  6. [转载] SimpleHTTPServer解释:如何使用Python发送文件
  7. KMP算法 --- 在文本中寻找目标字符串
  8. MySQL临时表详细解释
  9. jQuery.Revealing图片展示插件
  10. 答疑解惑 | 关于PMBOK第七版,常见问题合集【附电子版】
  11. 火狐浏览器打开发现是2345的网站-----解决方法
  12. 用代码过中秋,python海龟月饼你要不要尝一口?
  13. 阿里后端常用的 15 款开发工具,你不试试?
  14. 商品sku规格选择效果,没有商品的不能选中,选择顺序不影响展示结果
  15. 中国矿业大学算法概论作业一A、锯木棒
  16. iPhone6对flex的兼容
  17. 如何采用离线的 Google Map API 加载离线谷歌地图的方法
  18. 磁盘碎片整理软件评测
  19. 引用和指针概念及区别
  20. 2020-2021 ICPC 银川站【ACMer退役纪念】

热门文章

  1. JS面试题-闭包异步-变量提升-引用传值-this
  2. 面向对象的三特性(继承、多态、封装 )Python
  3. 7-1 射击游戏 (20 分)
  4. 统计数字字符和空格 (15 分)
  5. linux用户群组实验总结,linux基础概念和个人笔记总结(2)——账号和权限管理实验验证...
  6. 邻接矩阵存储图的深度优先遍历
  7. git tag什么时候使用_git使用教程9pycharm 使用 tag 打标签
  8. 数据结构-在O(1)时间删除链表节点
  9. oracle 数据结构部署,
  10. 团队冲刺第一阶段第五天