关于纸壳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. GridView自定义分页样式(上一页,下一页,到第几页)

    今天要为网站做一个文章列表,发现GridView的分页样式很难看,于是结合网上的例子,自己做了一个.不是很美观,不过还是很实用的,先看下效果吧,如图(1). 图(1)GridView分页效果 自定义G ...

  2. 在c#中设置Excel格式

    生成excel的时候有时候需要设置单元格的一些属性,可以参考一下: range.NumberFormatLocal = "@"; //设置单元格格式为文本 ange.get_Ran ...

  3. centos7.5配置双网卡上网

    一.环境及说明 当初有这个需求,主要是帮一个高校的客户搭建一个大数据集群,使用的是校园网,交换机上一个端口只能连接一部电脑上网,不能通过路由组建子网,确保集群中的服务器有子网ip的同时,也能够通过公网 ...

  4. golang实现任务分发处理

    package main import ( "flag" "fmt" "os" "log" "net/http ...

  5. 转:从框架看PHP的五种境界及各自的薪资待遇(仅限于二三线城市,一线除外)

    在撰写此文前首先必须申明的是本人不鄙视任何一种框架,也无意于挑起PHP框架间的战争,更没有贬低某个框架使用者的用意,本文纯粹个人的看法.你可以认为我无知也好,或者装逼也好,请不要试着在任何情况下,随便 ...

  6. iOS.AddFont

    为iOS App 添加定制字体 http://www.developers-life.com/how-to-include-ttf-fonts-to-ios-app.html http://blog. ...

  7. code4906 删数问题

    题目: 键盘输入一个高精度的正整数n(<=240位), 去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数. 编程对给定的n和s,寻找一种方案,使得剩下的数最小. Simple Inp ...

  8. Zookeeper 系列(五)Curator API

    Zookeeper 系列(五)Curator API 一.Curator 使用 Curator 框架中使用链式编程风格,易读性更强,使用工程方法创建连接对象使用. (1) CuratorFramewo ...

  9. easyui datagrid编辑

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Datagrid.aspx. ...

  10. LINUX网络编程 IO 复用

    参考<linux高性能服务器编程> LINUX下处理多个连接时候,仅仅使用多线程和原始socket函数,效率十分低下 于是就出现了selelct poll  epoll等IO复用函数. 这 ...