ASP .Net Core路由(Route) - 纸壳CMS的关键
关于纸壳CMS
纸壳CMS是一个开源免费的,可视化设计,在线编辑的内容管理系统。基于ASP .Net Core开发,插件式设计:

GitHub:https://github.com/SeriaWei/ZKEACMS.Core
路由
路由是ASP .Net里面至关重要的一个组成部分,路由的功能简单的说就是把用户请求的地址“转移”到对应的Controller,Action。而路由,也是纸壳CMS可以自定义页面的关键。
在纸壳CMS中,给路由定义了优先级,所以在处理用户请求地址的时候,通过路由的优先级来决定访问的流程走向,如果找到匹配的路由,则优先走该路由对应的 Controller -> Action -> View,如果没有匹配的路由,则走路由优先权最低的“全捕捉”路由来处理用户的请求,最后返回响应。
优先级最低的“全捕捉”路由是用来处理用户创建的页面。"{*path}",所有这些请求,都会到 PageController -> Main 进行处理。这样就可以把原来真实的页面,变为虚拟的,并由用户来创建,存到数据库中。请求流程,大致如下图所示:

全捕捉路由和通用后台路由的定义,Priority值越大,优先级越高:
new RouteDescriptor
{
RouteName = "pageRoute",
Template = "{*path}",
Defaults = new { controller = "Page", action = "Main" },
Constraints = new { path = new PageRouteConstraint() },
Priority = -
},
new RouteDescriptor
{
RouteName = "admin",
Template = "admin/{controller=Dashboard}/{action=index}/{id?}",
Defaults=new { module = "admin" },
Priority =
}
PageRouteConstraint
PageRouteConstraint,这里并不是用来约束路由的,而是在这里处理路由数据,要在这里构建RouteData,所以看代码,始终是返回true。
namespace ZKEACMS
{
public class PageRouteConstraint : IRouteConstraint
{
public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
{
var value = values[routeKey];
if (routeKey == "path" && value != null)
{
string path = "/" + value.ToString(); var routeDataProviders = httpContext.RequestServices.GetService<IEnumerable<IRouteDataProvider>>();
foreach (var item in routeDataProviders.OrderBy(m => m.Order))
{
path = item.ExtractVirtualPath(path, values);
}
if (path.IsNullOrWhiteSpace())
{
path = "/";
}
values[routeKey] = path;
}
return true;
}
}
}
纸壳CMS里面使用IRouteDataProvider来自定义处理请求URL和RouteData。例如使用HtmlRouteDataProvider来实现伪静态:
namespace ZKEACMS.Route
{
public class HtmlRouteDataProvider : IRouteDataProvider
{
const string htmlExt = ".html"; public int Order { get { return ; } } public string ExtractVirtualPath(string path, RouteValueDictionary values)
{
if (path.EndsWith(htmlExt, StringComparison.OrdinalIgnoreCase))
{
path = path.Substring(, path.LastIndexOf(htmlExt));
}
return path;
}
}
}
使用PaginationRouteDataProvider来获取分页数据等等:
namespace ZKEACMS.Route
{
public class PaginationRouteDataProvider : IRouteDataProvider
{
public int Order { get { return ; } }
public string ExtractVirtualPath(string path, RouteValueDictionary values)
{
if (CustomRegex.PageRegex.IsMatch(path))
{
int page = -;
path = CustomRegex.PageRegex.Replace(path, evaluator =>
{
int.TryParse(evaluator.Groups[].Value, out page);
return string.Empty;
});
if (page >= && !values.ContainsKey(StringKeys.RouteValue_Page))
{
values.Add(StringKeys.RouteValue_Page, page);
}
}
return path;
}
}
}
插件里的路由
每个插件都可以定义自己的路由,所以一定要处理它们的优先级关系。定义的方式很简单,在插件类(xxxPlug.cs)里面,实现RegistRoute方法就可以了。例如自定义表单插件里面的提交数据路由:
namespace ZKEACMS.FormGenerator
{
public class FormPlug : PluginBase
{
public override IEnumerable<RouteDescriptor> RegistRoute()
{
yield return new RouteDescriptor
{
RouteName = "FormData",
Template = "FormDataHandle/Submit",
Defaults = new { controller = "FormData", action = "Submit" },
Priority =
};
}
}
}
最后
纸壳CMS充分利用了路由来实现自定义页面的功能,而路由不再单纯的只有{controller}/{action}。看了纸壳CMS的路由机制,我相信你应该会有所收获,:-),欢迎有兴趣的大神们加入进来!
https://github.com/SeriaWei/ZKEACMS.Core
ASP .Net Core路由(Route) - 纸壳CMS的关键的更多相关文章
- 纸壳CMS 3.0升级.Net Core 2.1性能大提升
微软发布了.Net Core 2.1正式版,纸壳CMS也在第一时间做了升级,并做了一系列的优化和调整,性能大幅提升,并解决了一些历史遗留问题,添加了一些新功能. Github https://gith ...
- 纸壳CMS替换默认实现
简介 纸壳CMS是一个开源免费的可视化内容管理建站系统,拖拽就可以轻松建网站. GitHub: http://github.com/SeriaWei/ZKEACMS 纸壳CMS在设计上使用的是ASP. ...
- 在Docker中运行纸壳CMS并配置使用MySql
纸壳CMS是基于ASP.Net Core开发的可视化内容管理系统,可以跨平台部署,可以在容器中运行.接下来看看如何在docker中运行纸壳CMS. GitHub:https://github.com/ ...
- 使用vs code开发纸壳CMS并启用Razor智能提示
关于纸壳CMS 纸壳CMS是一个开源免费的,可视化设计,在线编辑的内容管理系统.基于ASP .Net Core开发,插件式设计: 下载代码 GitHub:https://github.com/Seri ...
- 纸壳CMS的插件加载机制
纸壳CMS是一个开源的可视化设计CMS,通过拖拽,在线编辑的方式来创建网站. GitHub https://github.com/SeriaWei/ZKEACMS.Core 欢迎Star,Fork,发 ...
- 纸壳CMS主题增强,支持主题中加入模板
背景 在之前,纸壳CMS的主题仅仅只是CSS样式,并不支持在主题下使用模板来构建不同的HTML结构.现在我们对主题功能做了增强,可以在主题下添加各自的模板,这样在制作主题时,就会更加自由.不仅如此,新 ...
- 纸壳CMS可视化建站系统搭建多语言网站
纸壳CMS是可视化建站系统,现已经从架构上支持多语言.但是多语言功能默认是没有开启的.您可以从设置中开启多语言,或者随时关闭它,您可以随时进行切换. 开启多语言 如果您没有在系统设置中看到多语言设置菜 ...
- 纸壳CMS 2.3,正式加入商城功能
纸壳CMS发布了2.3版本,主要是添加了商城功能,强化产品功能.让您的网站轻松实现电子商务. 有关2.3版本的更多信息,请查看以下链接: https://github.com/SeriaWei/ZKE ...
- 纸壳CMS(ZKEACMS)体验升级,快速创建页面,直接在页面中修改内容
关于纸壳CMS 纸壳CMS又名 ZKEACMS Core 是ZKEACMS的 .net core 版本,可运行在 .net core 1.1 平台上.是一个开源的CMS. 纸壳CMS对于 ZKEACM ...
随机推荐
- Unity3d dll 热更新 基础框架
APK包装到用户手机上后,代码如何更新,总不能全用LUA吧?特别是代码非常多的战斗手游 昨晚上有了dll 热更新的想法,今天做了一天的实验,也遇到些坑,这里总结下 工作环境: U3D5.3.2 + v ...
- mybatis遍历array数组与集合、json
遍历数组: int saveOptions(@Param("items")String[] items, @Param("questionId")int que ...
- 230. Kth Smallest Element in a BST 找到bst中的第k小的元素
[抄题]: Given a binary search tree, write a function kthSmallest to find the kth smallest element in i ...
- dede数据库内容替换,去掉文章内容中的img标签
1.织梦已经给我们准备好了数据库内容替换工具,在采集->批量维护->数据库内容替换 2.织梦的文章内容一般在放在dede_addonarticle表body字段中. (1).选择好数据表和 ...
- JTSL/EL Expression学习
最早的一个学习笔记,时间过去了久了,供java web初学者参考. JTSL/EL Expression学习安排 学习目标:掌握几个常见标签的使用,通晓工作原理,详细到代码层面,遇到问题时能查得出异常 ...
- .net core web api swagger 配置笔记
参考网址: --配置步骤见如下链接https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/web-api-help-pages-using-swa ...
- xmlhttp
File an issue about the selected textFile an issue about the selected text XMLHttpRequest Living Sta ...
- Java WebService 知识点汇总
java webservice 获取传入IP axis.jar servlet.jar MessageContext mMsgContext = MessageContext.getCurren ...
- ip白名单 通过* ? 检测IP匹配 轻量级
#include "stdafx.h" #include <windows.h> #include <string.h> #include <asse ...
- Devexpress VCL Build v2014 vol 14.1.4 发布
虽然这次没加什么新东西,但是及时更新支持xe7,还算可以. What's New in 14.1.4 (VCL Product Line) New Major Features in 14.1 W ...