博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NopCommerce Url分析
阅读量:6843 次
发布时间:2019-06-26

本文共 22574 字,大约阅读时间需要 75 分钟。

using System;using System.Web;using System.Web.Routing;using Nop.Core;using Nop.Core.Data;using Nop.Core.Infrastructure;using Nop.Services.Events;using Nop.Services.Seo;using Nop.Web.Framework.Localization;namespace Nop.Web.Framework.Seo{    ///     /// Provides properties and methods for defining a SEO friendly route, and for getting information about the route.    ///     public partial class GenericPathRoute : LocalizedRoute    {        #region Constructors        ///         /// Initializes a new instance of the System.Web.Routing.Route class, using the specified URL pattern and handler class.        ///         /// The URL pattern for the route.        /// The object that processes requests for the route.        public GenericPathRoute(string url, IRouteHandler routeHandler)            : base(url, routeHandler)        {        }        ///         /// Initializes a new instance of the System.Web.Routing.Route class, using the specified URL pattern, handler class and default parameter values.        ///         /// The URL pattern for the route.        /// The values to use if the URL does not contain all the parameters.        /// The object that processes requests for the route.        public GenericPathRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)            : base(url, defaults, routeHandler)        {        }        ///         /// Initializes a new instance of the System.Web.Routing.Route class, using the specified URL pattern, handler class, default parameter values and constraints.        ///         /// The URL pattern for the route.        /// The values to use if the URL does not contain all the parameters.        /// A regular expression that specifies valid values for a URL parameter.        /// The object that processes requests for the route.        public GenericPathRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler)            : base(url, defaults, constraints, routeHandler)        {        }        ///         /// Initializes a new instance of the System.Web.Routing.Route class, using the specified URL pattern, handler class, default parameter values,         /// constraints,and custom values.        ///         /// The URL pattern for the route.        /// The values to use if the URL does not contain all the parameters.        /// A regular expression that specifies valid values for a URL parameter.        /// Custom values that are passed to the route handler, but which are not used to determine whether the route matches a specific URL pattern. The route handler might need these values to process the request.        /// The object that processes requests for the route.        public GenericPathRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens, IRouteHandler routeHandler)            : base(url, defaults, constraints, dataTokens, routeHandler)        {        }        #endregion                #region Methods        ///         /// Returns information about the requested route.        ///         /// An object that encapsulates information about the HTTP request.        /// 
/// An object that contains the values from the route definition. ///
public override RouteData GetRouteData(HttpContextBase httpContext) { RouteData data = base.GetRouteData(httpContext); if (data != null && DataSettingsHelper.DatabaseIsInstalled()) { var urlRecordService = EngineContext.Current.Resolve
(); var slug = data.Values["generic_se_name"] as string; //performance optimization. //we load a cached verion here. it reduces number of SQL requests for each page load var urlRecord = urlRecordService.GetBySlugCached(slug); //comment the line above and uncomment the line below in order to disable this performance "workaround" //var urlRecord = urlRecordService.GetBySlug(slug); if (urlRecord == null) { //no URL record found //var webHelper = EngineContext.Current.Resolve
(); //var response = httpContext.Response; //response.Status = "302 Found"; //response.RedirectLocation = webHelper.GetStoreLocation(false); //response.End(); //return null; data.Values["controller"] = "Common"; data.Values["action"] = "PageNotFound"; return data; } //ensre that URL record is active if (!urlRecord.IsActive) { //URL record is not active. let's find the latest one var activeSlug = urlRecordService.GetActiveSlug(urlRecord.EntityId, urlRecord.EntityName, urlRecord.LanguageId); if (string.IsNullOrWhiteSpace(activeSlug)) { //no active slug found //var webHelper = EngineContext.Current.Resolve
(); //var response = httpContext.Response; //response.Status = "302 Found"; //response.RedirectLocation = webHelper.GetStoreLocation(false); //response.End(); //return null; data.Values["controller"] = "Common"; data.Values["action"] = "PageNotFound"; return data; } //the active one is found var webHelper = EngineContext.Current.Resolve
(); var response = httpContext.Response; response.Status = "301 Moved Permanently"; response.RedirectLocation = string.Format("{0}{1}", webHelper.GetStoreLocation(false), activeSlug); response.End(); return null; } //ensure that the slug is the same for the current language //otherwise, it can cause some issues when customers choose a new language but a slug stays the same var workContext = EngineContext.Current.Resolve
(); var slugForCurrentLanguage = SeoExtensions.GetSeName(urlRecord.EntityId, urlRecord.EntityName, workContext.WorkingLanguage.Id); if (!String.IsNullOrEmpty(slugForCurrentLanguage) && !slugForCurrentLanguage.Equals(slug, StringComparison.InvariantCultureIgnoreCase)) { //we should make not null or "" validation above because some entities does not have SeName for standard (ID=0) language (e.g. news, blog posts) var webHelper = EngineContext.Current.Resolve
(); var response = httpContext.Response; //response.Status = "302 Found"; response.Status = "302 Moved Temporarily"; response.RedirectLocation = string.Format("{0}{1}", webHelper.GetStoreLocation(false), slugForCurrentLanguage); response.End(); return null; } //process URL switch (urlRecord.EntityName.ToLowerInvariant()) { case "product": { data.Values["controller"] = "Product"; data.Values["action"] = "ProductDetails"; data.Values["productid"] = urlRecord.EntityId; data.Values["SeName"] = urlRecord.Slug; } break; case "category": { data.Values["controller"] = "Catalog"; data.Values["action"] = "Category"; data.Values["categoryid"] = urlRecord.EntityId; data.Values["SeName"] = urlRecord.Slug; } break; case "manufacturer": { data.Values["controller"] = "Catalog"; data.Values["action"] = "Manufacturer"; data.Values["manufacturerid"] = urlRecord.EntityId; data.Values["SeName"] = urlRecord.Slug; } break; case "vendor": { data.Values["controller"] = "Catalog"; data.Values["action"] = "Vendor"; data.Values["vendorid"] = urlRecord.EntityId; data.Values["SeName"] = urlRecord.Slug; } break; case "newsitem": { data.Values["controller"] = "News"; data.Values["action"] = "NewsItem"; data.Values["newsItemId"] = urlRecord.EntityId; data.Values["SeName"] = urlRecord.Slug; } break; case "blogpost": { data.Values["controller"] = "Blog"; data.Values["action"] = "BlogPost"; data.Values["blogPostId"] = urlRecord.EntityId; data.Values["SeName"] = urlRecord.Slug; } break; case "topic": { data.Values["controller"] = "Topic"; data.Values["action"] = "TopicDetails"; data.Values["topicId"] = urlRecord.EntityId; data.Values["SeName"] = urlRecord.Slug; } break; default: { //no record found //generate an event this way developers could insert their own types EngineContext.Current.Resolve
() .Publish(new CustomUrlRecordEntityNameRequested(data, urlRecord)); } break; } } return data; } #endregion }}

  

using System.Web;using System.Web.Routing;using Nop.Core.Data;using Nop.Core.Domain.Localization;using Nop.Core.Infrastructure;namespace Nop.Web.Framework.Localization{    ///     /// Provides properties and methods for defining a localized route, and for getting information about the localized route.    ///     public class LocalizedRoute : Route    {        #region Fields        private bool? _seoFriendlyUrlsForLanguagesEnabled;        #endregion        #region Constructors        ///         /// Initializes a new instance of the System.Web.Routing.Route class, using the specified URL pattern and handler class.        ///         /// The URL pattern for the route.        /// The object that processes requests for the route.        public LocalizedRoute(string url, IRouteHandler routeHandler)            : base(url, routeHandler)        {        }        ///         /// Initializes a new instance of the System.Web.Routing.Route class, using the specified URL pattern, handler class and default parameter values.        ///         /// The URL pattern for the route.        /// The values to use if the URL does not contain all the parameters.        /// The object that processes requests for the route.        public LocalizedRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)            : base(url, defaults, routeHandler)        {        }        ///         /// Initializes a new instance of the System.Web.Routing.Route class, using the specified URL pattern, handler class, default parameter values and constraints.        ///         /// The URL pattern for the route.        /// The values to use if the URL does not contain all the parameters.        /// A regular expression that specifies valid values for a URL parameter.        /// The object that processes requests for the route.        public LocalizedRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler)            : base(url, defaults, constraints, routeHandler)        {        }        ///         /// Initializes a new instance of the System.Web.Routing.Route class, using the specified URL pattern, handler class, default parameter values,         /// constraints,and custom values.        ///         /// The URL pattern for the route.        /// The values to use if the URL does not contain all the parameters.        /// A regular expression that specifies valid values for a URL parameter.        /// Custom values that are passed to the route handler, but which are not used to determine whether the route matches a specific URL pattern. The route handler might need these values to process the request.        /// The object that processes requests for the route.        public LocalizedRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens, IRouteHandler routeHandler)            : base(url, defaults, constraints, dataTokens, routeHandler)        {        }        #endregion        #region Methods        ///         /// Returns information about the requested route.        ///         /// An object that encapsulates information about the HTTP request.        /// 
/// An object that contains the values from the route definition. ///
public override RouteData GetRouteData(HttpContextBase httpContext) { if (DataSettingsHelper.DatabaseIsInstalled() && this.SeoFriendlyUrlsForLanguagesEnabled) { string virtualPath = httpContext.Request.AppRelativeCurrentExecutionFilePath; string applicationPath = httpContext.Request.ApplicationPath; if (virtualPath.IsLocalizedUrl(applicationPath, false)) { //In ASP.NET Development Server, an URL like "http://localhost/Blog.aspx/Categories/BabyFrog" will return //"~/Blog.aspx/Categories/BabyFrog" as AppRelativeCurrentExecutionFilePath. //However, in II6, the AppRelativeCurrentExecutionFilePath is "~/Blog.aspx" //It seems that IIS6 think we're process Blog.aspx page. //So, I'll use RawUrl to re-create an AppRelativeCurrentExecutionFilePath like ASP.NET Development Server. //Question: should we do path rewriting right here? string rawUrl = httpContext.Request.RawUrl; var newVirtualPath = rawUrl.RemoveLanguageSeoCodeFromRawUrl(applicationPath); if (string.IsNullOrEmpty(newVirtualPath)) newVirtualPath = "/"; newVirtualPath = newVirtualPath.RemoveApplicationPathFromRawUrl(applicationPath); newVirtualPath = "~" + newVirtualPath; httpContext.RewritePath(newVirtualPath, true); } } RouteData data = base.GetRouteData(httpContext); return data; } /// /// Returns information about the URL that is associated with the route. /// /// An object that encapsulates information about the requested route. /// An object that contains the parameters for a route. ///
/// An object that contains information about the URL that is associated with the route. ///
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) { VirtualPathData data = base.GetVirtualPath(requestContext, values); if (data != null && DataSettingsHelper.DatabaseIsInstalled() && this.SeoFriendlyUrlsForLanguagesEnabled) { string rawUrl = requestContext.HttpContext.Request.RawUrl; string applicationPath = requestContext.HttpContext.Request.ApplicationPath; if (rawUrl.IsLocalizedUrl(applicationPath, true)) { data.VirtualPath = string.Concat(rawUrl.GetLanguageSeoCodeFromUrl(applicationPath, true), "/", data.VirtualPath); } } return data; } public virtual void ClearSeoFriendlyUrlsCachedValue() { _seoFriendlyUrlsForLanguagesEnabled = null; } #endregion #region Properties protected bool SeoFriendlyUrlsForLanguagesEnabled { get { if (!_seoFriendlyUrlsForLanguagesEnabled.HasValue) _seoFriendlyUrlsForLanguagesEnabled = EngineContext.Current.Resolve
().SeoFriendlyUrlsForLanguagesEnabled; return _seoFriendlyUrlsForLanguagesEnabled.Value; } } #endregion }}

 

using System.Runtime.CompilerServices;namespace System.Web.Routing{    //    // 摘要:    //     提供用于定义路由及获取路由相关信息的属性和方法。    [TypeForwardedFrom("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")]    public class Route : RouteBase    {        //        // 摘要:        //     使用指定的 URL 模式和处理程序类初始化 System.Web.Routing.Route 类的新实例。        //        // 参数:        //   url:        //     路由的 URL 模式。        //        //   routeHandler:        //     处理路由请求的对象。        public Route(string url, IRouteHandler routeHandler);        //        // 摘要:        //     使用指定的 URL 模式、默认参数值和处理程序类初始化 System.Web.Routing.Route 类的新实例。        //        // 参数:        //   url:        //     路由的 URL 模式。        //        //   defaults:        //     用于 URL 中缺失的任何参数的值。        //        //   routeHandler:        //     处理路由请求的对象。        public Route(string url, RouteValueDictionary defaults, IRouteHandler routeHandler);        //        // 摘要:        //     使用指定的 URL 模式、默认参数值、约束和处理程序类初始化 System.Web.Routing.Route 类的新实例。        //        // 参数:        //   url:        //     路由的 URL 模式。        //        //   defaults:        //     要在 URL 不包含所有参数时使用的值。        //        //   constraints:        //     一个用于指定 URL 参数的有效值的正则表达式。        //        //   routeHandler:        //     处理路由请求的对象。        public Route(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler);        //        // 摘要:        //     使用指定的 URL 模式、默认参数值、约束、自定义值和处理程序类初始化 System.Web.Routing.Route 类的新实例。        //        // 参数:        //   url:        //     路由的 URL 模式。        //        //   defaults:        //     要在 URL 不包含所有参数时使用的值。        //        //   constraints:        //     一个用于指定 URL 参数的有效值的正则表达式。        //        //   dataTokens:        //     传递到路由处理程序但未用于确定该路由是否匹配特定 URL 模式的自定义值。 这些值会传递到路由处理程序,以便用于处理请求。        //        //   routeHandler:        //     处理路由请求的对象。        public Route(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens, IRouteHandler routeHandler);        //        // 摘要:        //     获取或设置为 URL 参数指定有效值的表达式的词典。        //        // 返回结果:        //     一个包含参数名称和表达式的对象。        public RouteValueDictionary Constraints { get; set; }        //        // 摘要:        //     获取或设置传递到路由处理程序但未用于确定该路由是否匹配 URL 模式的自定义值。        //        // 返回结果:        //     一个包含自定义值的对象。        public RouteValueDictionary DataTokens { get; set; }        //        // 摘要:        //     获取或设置要在 URL 不包含所有参数时使用的值。        //        // 返回结果:        //     一个包含参数名称和默认值的对象。        public RouteValueDictionary Defaults { get; set; }        //        // 摘要:        //     获取或设置处理路由请求的对象。        //        // 返回结果:        //     处理请求的对象。        public IRouteHandler RouteHandler { get; set; }        //        // 摘要:        //     获取或设置路由的 URL 模式。        //        // 返回结果:        //     用于匹配路由和 URL 的模式。        //        // 异常:        //   T:System.ArgumentException:        //     以下任一值: 以 ~ 或 / 开头的值。 包含 ? 字符的值。 “全部捕捉”参数不在末尾。        //        //   T:System.Exception:        //     没有使用分隔符或文字常量分隔 URL 分段。        public string Url { get; set; }        //        // 摘要:        //     返回有关所请求路由的信息。        //        // 参数:        //   httpContext:        //     一个对象,封装有关 HTTP 请求的信息。        //        // 返回结果:        //     一个对象,其中包含路由定义中的值。        public override RouteData GetRouteData(HttpContextBase httpContext);        //        // 摘要:        //     返回与路由关联的 URL 的相关信息。        //        // 参数:        //   requestContext:        //     一个对象,封装有关所请求的路由的信息。        //        //   values:        //     一个包含路由参数的对象。        //        // 返回结果:        //     一个包含与路由关联的 URL 的相关信息的对象。        public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values);        //        // 摘要:        //     确定参数值是否与该参数的约束匹配。        //        // 参数:        //   httpContext:        //     一个对象,封装有关 HTTP 请求的信息。        //        //   constraint:        //     用于测试 parameterName 的正则表达式或对象。        //        //   parameterName:        //     要测试的参数的名称。        //        //   values:        //     要测试的值。        //        //   routeDirection:        //     一个指定 URL 路由是否处理传入请求或构造 URL 的值。        //        // 返回结果:        //     如果参数值与约束匹配,则为 true;否则为 false。        //        // 异常:        //   T:System.InvalidOperationException:        //     constraint 不是包含正则表达式的字符串。        protected virtual bool ProcessConstraint(HttpContextBase httpContext, object constraint, string parameterName, RouteValueDictionary values, RouteDirection routeDirection);    }}

 

using System;using System.Web.Mvc;using System.Web.Routing;namespace Nop.Web.Framework.Seo{    public static class GenericPathRouteExtensions    {        //Override for localized route        public static Route MapGenericPathRoute(this RouteCollection routes, string name, string url)        {            return MapGenericPathRoute(routes, name, url, null /* defaults */, (object)null /* constraints */);        }        public static Route MapGenericPathRoute(this RouteCollection routes, string name, string url, object defaults)        {            return MapGenericPathRoute(routes, name, url, defaults, (object)null /* constraints */);        }        public static Route MapGenericPathRoute(this RouteCollection routes, string name, string url, object defaults, object constraints)        {            return MapGenericPathRoute(routes, name, url, defaults, constraints, null /* namespaces */);        }        public static Route MapGenericPathRoute(this RouteCollection routes, string name, string url, string[] namespaces)        {            return MapGenericPathRoute(routes, name, url, null /* defaults */, null /* constraints */, namespaces);        }        public static Route MapGenericPathRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces)        {            return MapGenericPathRoute(routes, name, url, defaults, null /* constraints */, namespaces);        }        public static Route MapGenericPathRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces)        {            if (routes == null)            {                throw new ArgumentNullException("routes");            }            if (url == null)            {                throw new ArgumentNullException("url");            }            var route = new GenericPathRoute(url, new MvcRouteHandler())            {                Defaults = new RouteValueDictionary(defaults),                Constraints = new RouteValueDictionary(constraints),                DataTokens = new RouteValueDictionary()            };            if ((namespaces != null) && (namespaces.Length > 0))            {                route.DataTokens["Namespaces"] = namespaces;            }            routes.Add(name, route);            return route;        }    }}

 

转载地址:http://cxsul.baihongyu.com/

你可能感兴趣的文章
Silverlight学习笔记之使用TranslateTransform控制对象位置
查看>>
在Web Application中集成CAS登录模块
查看>>
webApp路由控制-vue-router2.0
查看>>
PyQT实现扩展窗口,更多/隐藏
查看>>
阿里巴巴最新开源项目 - [HandyJSON] 在Swift中优雅地处理JSON
查看>>
怎样使视图的标签是波浪形
查看>>
国际版本Office365与国内版本office365的功能介绍
查看>>
网络安全系列之二十七 利用MicroSoft Private Folder加密文件
查看>>
VMware vSphere 5.1 群集深入解析(二十八)- vSphere配置
查看>>
主流的深度学习模型有哪些?
查看>>
HTML语言教程电子书下载 By思念狗的骨头
查看>>
Python进行URL解码
查看>>
Flash播放mp4的两个问题:编码问题和需要下载完后才能播放的问题
查看>>
Ubuntu环境变量解析
查看>>
说说JSON和JSONP,也许你会豁然开朗(转)
查看>>
final关键字的应用
查看>>
4.5. synctool
查看>>
【Linux】linux命令大全
查看>>
Linux busybox mount -a fstab
查看>>
j中的substr(start,length)和substring(start,stop)
查看>>