YbSoftwareFactory 代码生成插件【二十四】:MVC中实现动态自定义路由

上一篇介绍了 公文流转系统 的实现,本篇介绍下MVC下动态自定义路由的实现。

在典型的CMS系统中,通常需要为某个栏目指定个友链地址,通过指定友链地址,该栏目的地址更人性化、方便记忆,也有利用于搜索引擎优化。

但在MVC中,通常需要在应用程序启动时注册路由规则,该路由规则又通常和控制器进行了关联,也就是某个地址通常情况下都是有对应的控制器进行处理的。但在MVC中如何做到自定义动态路由,以便能在运行时通过某个控制器处理一些运行时动态设定的Url地址呢?

方法当然是有的:

   1、首先实现一个动态路由约束条件类:

   该类用于判断指定的路由地址是否满足特定的路由规则,当然该规则需要在后面进行注册才会生效。

 1 public class CmsUrlConstraint : IRouteConstraint
 2     {
 3         public CmsUrlConstraint()
 4         {
 5
 6         }
 7         /// <summary>
 8         /// 动态查询数据库,判断当前请求地址是否满足约定
 9         /// </summary>
10         /// <param name="httpContext"></param>
11         /// <param name="route"></param>
12         /// <param name="parameterName"></param>
13         /// <param name="values"></param>
14         /// <param name="routeDirection"></param>
15         /// <returns></returns>
16         public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values,
17             RouteDirection routeDirection)
18         {
19             if (values[parameterName] != null)
20             {
21                 //此为请求的友链地址参数
22                 var permalink = values[parameterName].ToString();
23
24                 var dbcontext = new YbObjectContext("YbRapidSolution");
25                 //根据友链地址参数,查找栏目,存在则表示匹配成功
26                 var page = dbcontext.Set<CmsColumn>()
27                     .Where(p => p.Permalink == permalink).FirstOrDefault();
28                 if (page != null)
29                 {
30                     //匹配成功进行数据传值
31                     HttpContext.Current.Items["cmspage"] = page;
32                     return true;
33                 }
34                 return false;
35             }
36             return false;
37         }
38     }

   2、然后注册路由CmsColumnRoute和CmsRoute,指定上述满足约束条件的地址该由哪个真实的控制器进行处理:

 1 public static void RegisterRoutes(RouteCollection routes)
 2         {
 3             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 4             //routes.IgnoreRoute("{UEditor/controller}.ashx{*pathInfo}");
 5             routes.IgnoreRoute("{resource}.ashx/{*pathInfo}");
 6
 7             routes.MapRoute(
 8             name: "CmsColumnRoute",
 9             url: "{*permalink}",
10             defaults: new { controller = "Home", action = "ColumnPage", id = UrlParameter.Optional },
11             constraints: new { permalink = new CmsUrlConstraint() }
12             );
13             routes.MapRoute(
14             name: "CmsRoute",
15             url: "{action}/{*permalink}",
16             defaults: new { controller = "Home", action = "ColumnPage", id = UrlParameter.Optional },
17             constraints: new { permalink = new CmsUrlConstraint() }
18             );
19
20             routes.MapRoute(
21                 name: "Default",
22                 url: "{controller}/{action}/{id}",
23                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional}
24             );
25         }

运行原理:

1、输入特定地址

2、系统通过CmsUrlConstraint类的Match方法查询数据库,如该地址和某个栏目中设定的友链地址一致,则表示匹配成功

3、如匹配成功,则通过注册路由时设定的Controller和Action进行后续处理并返回View。

   具体过程如下:

   实现效果如下:

   1、运行过程中可随意指定该栏目的地址:

   2、然后通过指定的地址可访问该页面,但我们并没有专门实现News的控制器:

时间: 2024-12-26 13:04:24

YbSoftwareFactory 代码生成插件【二十四】:MVC中实现动态自定义路由的相关文章

YbSoftwareFactory 代码生成插件【十九】:实体类配合数据库表字段进行属性扩展的小技巧

实体类通常需要和数据库表进行了ORM映射,当你需要添加新的属性时,往往同时也需要在数据库中添加相应的字段并配置好映射关系,同时可能还需对数据访问组件进行重新编译和部署才能有效.而当你开始设计一个通用数据访问组件后,因为项目需求的不同和需求的不断变化演变,很难不能保证不会再添加额外的属性和字段.特别是项目部署运行后,添加一个属性和字段带来的额外维护的工作量可能要远远超过对代码进行调整的工作量.本文提供了属性字段扩展的一种思路,在满足核心字段可通过实体类强类型进行访问的同时,还可通过C# 4.0提供

YbSoftwareFactory 代码生成插件【十八】:树形结构下的查询排序的数据库设计

树形结构的排序在中国特色下十分普遍也非常重要,例如常说的五大班子,党委>人大>政府>政协>纪委,每个班子下还有部门,岗位,人员,最终排列的顺序通常需要按权力大小.重要性等进行排列,顺序排列不好可是重大的罪过,领导很生气,后果很严重.这种排序方式本质上就是典型的树形结构深度排序,但在数据库中很难直接通过SQL语句简单高效地进行处理,更不用说还要支持不同类型数据库了. 当前解决此类问题,主要有两种方法. 1. 排序码方式 原理:在每个树形节点上均设置一个排序码,排序码通常是一个字符串并

24、手把手教你Extjs5(二十四)模块Form的自定义的设计[3]

自定义的Form已经可以运行了,下面改一下配置,把Form里面的FieldSet放在Tab之下.修改一下ModuleModel.js中的data下的tf_FormSchemes下的方案,增加一个属性. 上面设置好了以后,可以看到Form中FieldSet都放置在Tab中了,下面的截图展示了二个Tab的界面. 从理论上说,如果你的Form配置信息设置得合理,可以得到你想要的任何样式的Form.但在实际应用的时候,我们只要完成大部分能自动生成就足够了,真正程序中有超级变态复杂的Form结构,可以自己

YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法

上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把查询结果的 HTML 代码呈现到 Razor 视图中,考虑到灵活性,需要能在任意 Razor 视图中调用该方法,这样任意 Razor 页面都能以统一的方式方便地共享该页面部件的 HTML 内容,这对于代码的重用性和可维护性都是非常有必要的. 为实现上述要求,本文介绍如下可供选择的三种方式.   1.

二十四、Struts2中的UI标签

二十四.Struts2中的UI标签 Struts2中UI标签的优势: 数据回显 页面布局和排版(Freemark),struts2提供了一些常用的排版(主题:xhtml默认 simple ajax) 可以使用OGNL表达式 模板: 常量设置的:struts.ui.theme=xhtml 开发中建议设置为struts.ui.theme=simple;

ActionScript3游戏中的图像编程(连载二十四)

2.1.1 投影样式的制作 点击左侧列表的“投影”系列,在阴影的衬托下,图像的层次感出来了(请确保右侧的“预览”复选框处于被勾选状态,否则编辑样式的时候无法实时观察到图层的最终效果)(图 2.2). 图 2.2 给文字添加投影样式 边缘似乎不太柔和,略显生硬,可能因为字体设置得过大所致,故投影边缘也应随之扩大.从字面上看,大小最接近这个含义.我们把它调到10,效果稍稍舒服了一些.(图 2.3) 图 2.3 投影大小设置为10的效果 ActionScript3游戏中的图像编程(连载二十四)

Android学习路线(二十四)ActionBar Fragment运用最佳实践

通过前面的几篇博客,大家看到了Google是如何解释action bar和fragment以及推荐的用法.俗话说没有demo的博客不是好博客,下面我会介绍一下action bar和fragment在实战中的应用,以及相关demo源码,希望和大家相互交流. 了解过fragment的同学们应该都知道,fragment是android 3.0版本才出现的的,因此如果要在支持android 3.0一下版本的工程中使用fragment的话是需要添加Support Library的.具体如何添加我就不再赘述

从零开始学android&lt;android事件的处理方式.二十四.&gt;

在android中一共有 多种事件,每种事件都有自己相对应的处理机制 如以下几种 1 单击事件 View.OnClickListener public abstract void onClick (View v) 单击组件时触发 2 单击事件 View.OnLongClickListener public abstract boolean onLongClick (View v) 长按组件时触发 3 键盘事件 View.OnKeyListener public abstract boolean

攻城狮在路上(叁)Linux(二十四)--- linux设置开机挂载及镜像文件挂载

虽然可以手动进行文件系统的挂载,但是每次都手动挂载就会很麻烦,开机挂载的目的就是实现文件系统的自动挂载. 一.开机挂载:/etc/fstab及/etc/mtab 主要是通过修改/etc/fstab文件的配置来实现. fstab是开机时的设置,实际文件系统的挂载是记录到/etc/mtab和/proc/mounts这两个文件中. 1.系统挂载的限制: A.根目录/必须挂载,而且一定是最先挂载的,要先于其他mount point. B.其他挂载点必须为已新建的目录,可以任意指定. C.所有挂载点在同一