关于纸壳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

ASP .Net Core路由(Route) - 纸壳CMS的关键的更多相关文章

  1. 纸壳CMS 3.0升级.Net Core 2.1性能大提升

    微软发布了.Net Core 2.1正式版,纸壳CMS也在第一时间做了升级,并做了一系列的优化和调整,性能大幅提升,并解决了一些历史遗留问题,添加了一些新功能. Github https://gith ...

  2. 纸壳CMS替换默认实现

    简介 纸壳CMS是一个开源免费的可视化内容管理建站系统,拖拽就可以轻松建网站. GitHub: http://github.com/SeriaWei/ZKEACMS 纸壳CMS在设计上使用的是ASP. ...

  3. 在Docker中运行纸壳CMS并配置使用MySql

    纸壳CMS是基于ASP.Net Core开发的可视化内容管理系统,可以跨平台部署,可以在容器中运行.接下来看看如何在docker中运行纸壳CMS. GitHub:https://github.com/ ...

  4. 使用vs code开发纸壳CMS并启用Razor智能提示

    关于纸壳CMS 纸壳CMS是一个开源免费的,可视化设计,在线编辑的内容管理系统.基于ASP .Net Core开发,插件式设计: 下载代码 GitHub:https://github.com/Seri ...

  5. 纸壳CMS的插件加载机制

    纸壳CMS是一个开源的可视化设计CMS,通过拖拽,在线编辑的方式来创建网站. GitHub https://github.com/SeriaWei/ZKEACMS.Core 欢迎Star,Fork,发 ...

  6. 纸壳CMS主题增强,支持主题中加入模板

    背景 在之前,纸壳CMS的主题仅仅只是CSS样式,并不支持在主题下使用模板来构建不同的HTML结构.现在我们对主题功能做了增强,可以在主题下添加各自的模板,这样在制作主题时,就会更加自由.不仅如此,新 ...

  7. 纸壳CMS可视化建站系统搭建多语言网站

    纸壳CMS是可视化建站系统,现已经从架构上支持多语言.但是多语言功能默认是没有开启的.您可以从设置中开启多语言,或者随时关闭它,您可以随时进行切换. 开启多语言 如果您没有在系统设置中看到多语言设置菜 ...

  8. 纸壳CMS 2.3,正式加入商城功能

    纸壳CMS发布了2.3版本,主要是添加了商城功能,强化产品功能.让您的网站轻松实现电子商务. 有关2.3版本的更多信息,请查看以下链接: https://github.com/SeriaWei/ZKE ...

  9. 纸壳CMS(ZKEACMS)体验升级,快速创建页面,直接在页面中修改内容

    关于纸壳CMS 纸壳CMS又名 ZKEACMS Core 是ZKEACMS的 .net core 版本,可运行在 .net core 1.1 平台上.是一个开源的CMS. 纸壳CMS对于 ZKEACM ...

随机推荐

  1. Unity3d dll 热更新 基础框架

    APK包装到用户手机上后,代码如何更新,总不能全用LUA吧?特别是代码非常多的战斗手游 昨晚上有了dll 热更新的想法,今天做了一天的实验,也遇到些坑,这里总结下 工作环境: U3D5.3.2 + v ...

  2. mybatis遍历array数组与集合、json

    遍历数组: int saveOptions(@Param("items")String[] items, @Param("questionId")int que ...

  3. 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 ...

  4. dede数据库内容替换,去掉文章内容中的img标签

    1.织梦已经给我们准备好了数据库内容替换工具,在采集->批量维护->数据库内容替换 2.织梦的文章内容一般在放在dede_addonarticle表body字段中. (1).选择好数据表和 ...

  5. JTSL/EL Expression学习

    最早的一个学习笔记,时间过去了久了,供java web初学者参考. JTSL/EL Expression学习安排 学习目标:掌握几个常见标签的使用,通晓工作原理,详细到代码层面,遇到问题时能查得出异常 ...

  6. .net core web api swagger 配置笔记

    参考网址: --配置步骤见如下链接https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/web-api-help-pages-using-swa ...

  7. xmlhttp

    File an issue about the selected textFile an issue about the selected text XMLHttpRequest Living Sta ...

  8. Java WebService 知识点汇总

    java webservice 获取传入IP axis.jar    servlet.jar MessageContext mMsgContext = MessageContext.getCurren ...

  9. ip白名单 通过* ? 检测IP匹配 轻量级

    #include "stdafx.h" #include <windows.h> #include <string.h> #include <asse ...

  10. 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 ...