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

简介:
[索引页]
[源码下载]


精进不休 .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 {  getset; } 
                         public  string ProductName {  getset; } 
                         public double ProductPrice {  getset; } 
                } 
        } 
}
 
 
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>
 
 

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


相关文章
|
6月前
|
存储 开发框架 前端开发
asp.net与asp.net优缺点及示例
asp.net与asp.net优缺点及示例
|
1月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
60 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
95 5
|
7月前
|
开发框架 前端开发 .NET
.NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!
.NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!
174 0
.NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!
|
8月前
|
存储 开发框架 .NET
ASP.NET学生管理系统(.NET毕业设计)
ASP.NET学生管理系统(.NET毕业设计)
99 0
|
10月前
|
开发框架 供应链 前端开发
net基于asp.net的社区团购网站
社区团购系统依托社区团购系统和社区门店,是现在的一个重大市场和发展方向,通过研究企业在社区团购系统环境下的营销模式创新,对于普通的零售业和传统社区团购系统的转型发展具有重要的理论意义。随着互联网行业的发展,人们的生活方式发生着重大变化,人们越来越倾向于网络购物,这对传统企业来说如何把客户留下是一个重大挑战。就现在而言,由于社区团购的竞争已经进入最紧张激烈的阶段,有些团购平台甚至已经彼此之间打起了价格战,其中不乏有平台因为利润变少或资金链断裂而半途败亡。企业在实际的商业活动中,往往会面临许多等待优化的问题。因此,要在竞争激烈的市场中拔得头筹,必须重视提升对新商业模式的全面认知,科学于实际贴合的分
|
存储 开发框架 NoSQL
ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis
ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis
284 0
ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis
|
12天前
|
JavaScript
vue截取URL中的参数
vue截取URL中的参数
12 0
|
2月前
|
前端开发
[牛客网-前端大挑战QD2] 获取url参数
[牛客网-前端大挑战QD2] 获取url参数
19 0
|
2月前
BurpSuite8.2 -- 查找包含id参数的URL
BurpSuite8.2 -- 查找包含id参数的URL
19 1