关于纸壳CMS

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

GitHubhttps://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

最新文章

  1. jQuery的封装方式与JS中new的实现原理
  2. capwap DTSL 加密分析
  3. PHP 下option selected 无效
  4. 事务复制-大批量DEL操作
  5. win10-golang环境变量设置
  6. App Naver Line 5.3 add new features - &quot;True Delete&quot;
  7. 应用程序如何找到DLL文件?
  8. 树的最大深度 leecode java
  9. 【欧拉函数】【HDU1286】 找新朋友
  10. Unreal Engine 4 创建Destructible Mesh(可破坏网格)
  11. 设计模式——工厂模式(Factory)
  12. js 带遮罩层的弹出层
  13. centos 7.3二进制安装mariadb10.2.8完美步骤
  14. Java 大数类BigInteger和BigDecimal的基本函数
  15. malloc函数用法
  16. UE4类修饰符
  17. 解决 Visual Studio 点击添加引用无反应的问题
  18. python入门学习:2.列表简介
  19. 大端&amp;小端问题
  20. C#中的Action和Func和Predicate

热门文章

  1. clamp 函数
  2. 14- Servlet.service() for servlet [mvc-dispatcher] in context with path [/collegeservice] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root caus
  3. 12-matlab简单读excel
  4. 仿微信客户端 帧布局中加入fragment
  5. google中guava类库:AsyncEventBus
  6. 品味性能之道&lt;五&gt;:SQL分析工具
  7. Winpython环境下mayavi配置
  8. 【DBCP】DBCP基本配置和重连配置+spring中配置
  9. hdu-1181(bfs)
  10. mysql操作说明,插入时外键约束,快速删除