
时间:2015-06-28 00:00 来源:IT猫扑网|http://www.itmop.com/ 作者:网管联盟 我要评论(0)
由于MVC框架发展不久,还有很多不足的地方。其中关于路由规则配置这一块问题比较大。首先路由规则是在全局配置问价 Global.asax 的 Application_Start()事件中注册的。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute(&{resource}.axd/{*pathInfo}&);
routes.MapRoute( &User&,
// Route name
&{controller}/{action}/{id}&,
// URL with parameters new { controller = &User&, action = &Show&, id = &0& }
// Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
默认硬编码的方式使得以后可维护程度大大降低。MVC 1.0 似乎没有提供很好的基于配置文件的路由规则设置。所以只好自己实现了。直到写这篇文章时,才找到了一个比较好的解决方案。
以下是 自定义的XML 格式
<?xml version=&1.0& encoding=&utf-8& ?> <MapRoutes> <!--默认规则-->
<MapRoute name=&Default& url=&{controller}/{action}&> <Params>
<Item key=&controller& default=&Article&/>
<Item key=&action& default=&Index&/>
</Params>
</MapRoute>
<!--显示新闻列表的路由规则-->
<MapRoute name=&ShowArticleList& url=&{controller}/{action}/{typeId}/{pageIndex}/{pageSize}&>
<Params>
<Item key=&controller& default=&Article&/>
<Item key=&action& default=&Index&/>
<Item key=&typeId& default=&1&/>
<Item key=&pageIndex& default=&1&/>
<Item key=&pageSize& default=&10&/>
</Params>
</MapRoute>
</MapRoutes> 以下是全部代码
***********************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Routing;
using System.Web.Mvc;
using System.Xml.Linq;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
namespace Tension.Mvc
{
public static class RouteHelper
{
/// <summary>
/// 从XML文件中注册路由规则
/// </summary>
/// <param name=&routes&></param>
/// <param name=&cfgFile&></param>
public static void Register(this RouteCollection routes, string cfgFile)
{
IList<Route> Routes = GetRoutes(cfgFile);
foreach (var item in Routes)
{
//路由规则对象
object obj = CreateObjectFormString(item.ToString(), item.Name);
routes.MapRoute(
item.Name,
// Route name
item.Url,
// URL with parameters
obj
// Parameter defaults
);
}
}
/// <summary>
/// 从XML文件中注册路由规则 默认文件为网站根目录下MapRoute.config
/// </summary> /// <param name=&routes&></param>
public static void Register(this RouteCollection routes)
{
Register(routes, string.Format(&{0}MapRoute.config&, Tension.ServerInfo.GetRootPath()));
}
/// <summary>
/// 从string动态创建类对象
/// </summary>
/// <param name=&codeString&></param>
/// <param name=&className&></param>
/// <returns></returns>
private static object CreateObjectFormString(string codeString, string className)
{
CSharpCodeProvider ccp = new CSharpCodeProvider();
Compilerparameters param = new CompilerParameters(new string[] { &System.dll& });
CompilerResults cr = ccp.CompileAssemblyFromSource(param, codeString);
Type type = cr.CompiledAssembly.GetType(className);
return type.Getconstructor(System.Type.EmptyTypes).Invoke(null);
}
#p#副标题#e#
/// <summary> /// 从XML文件中解析路由规则 /// </summary>
/// <param name=&configFile&></param> /// <returns></returns>
private static IList<Route> GetRoutes(string configFile)
{
StringBuilder sb = new StringBuilder();
Console.WriteLine(sb.ToString());
IList<Route> Routes = new List<Route>();
XElement xe = XElement.Load(configFile);
#region MyRegion foreach (var item in xe.Elements(&MapRoute&))
{
名称属性 XAttribute xaName = item.Attribute(&name&);
if (xaName == null || string.IsNullOrEmpty(xaName.Value))
{
throw new ArgumentNullException(&name!说明:路由配置文件中某规则缺少name属性或name属性的值为空字符串&);
}
//URL属性 XAttribute urlName = item.Attribute(&url&);
if (urlName == null || string.IsNullOrEmpty(urlName.Value))
{
throw new ArgumentNullException(&url!说明:路由配置文件中某规则缺少url属性或url属性的值为空字符串&);
}
Dictionary<string, string> DictParams = new Dictionary<string, string>();
#region MyRegion
foreach (var pItem in item.Element(&Params&).Elements(&Item&))
{
XAttribute itemKey = pItem.Attribute(&key&);
if (itemKey == null || string.IsNullOrEmpty(itemKey.Value))
{
throw new ArgumentNullException(&Item->key!说明:路由配置文件中某规则缺少Item->key属性或Item->key属性的值为空字符串&);
}
XAttribute itemDefault = pItem.Attribute(&default&);
if (itemDefault == null || string.IsNullOrEmpty(itemDefault.Value))
{
throw new ArgumentNullException(&Item->default!说明:路由配置文件中某规则缺少Item->default属性或Item->default属性的值为空字符串&);
}
DictParams.Add(itemKey.Value, itemDefault.Value);
}
#endregion Routes.Add(new Route()
{
Name = xaName.Value, Url = urlName.Value, Params = DictParams });
}
#endregion return Routes;
}
}
/// <summary> /// 路由规则 /// </summary>
public class Route {
public string Name { get; set; }
public string Url { get; set; }
public Dictionary<string, string> Params { get; set; }
/// <summary> /// 重写ToString 方法 产生需要动态代码段
/// </summary> /// <returns></returns> public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.
关键词标签:ASP.NET,MVC,路由规则
相关阅读 ASP.NET创建XML Web服务全接触 如何提高ASP.NET页面载入速度的方法 .net导出海量数据到execl文件 ASP.NET 2.0程序安全的基础知识 ASP.NET中MD5与SHA1加密的几种方法 在.net开发中几个重要的认识误区
热门文章
在ASP.NET MVC中实现大文件异步上传
在.NET环境下为网站增加IP过滤功能
诛仙3飞升任务怎么做-诛仙3飞升任务流程最新2022
ASP.NET 如何避免页面重新整理时重复送出
钟离圣遗物推荐-原神钟离圣遗物词条
人气排行 诛仙3飞升任务怎么做-诛仙3飞升任务流程最新2022 asp.net表单提交方法GETPOST 在ASP.NET中如何判断用户IE浏览器的版本 Asp.net中messagebox的实现方法 Asp.net中的web.config配置 在ASP.NET MVC中实现大文件异步上传 asp.net获取URL和IP地址 FileUpload上传多文件出现错误的解决方法 ASP.NET Web.config配置详解 Asp.net常用的51个代码(非常实用) ASP.NET打开word文档出错的解决办法 让你的.NET程序兼容不同版本的Dll文件
查看所有0条评论>>