日期:2015-06-28 00:00:00 来源: IT猫扑网
由于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 格式
以下是全部代码
***********************************************/
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
{
///
/// 从XML文件中注册路由规则
///
///
///
public static void Register(this RouteCollection routes, string cfgFile)
{
IList
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
);
}
}
///
/// 从XML文件中注册路由规则 默认文件为网站根目录下MapRoute.config
//////
public static void Register(this RouteCollection routes)
{
Register(routes, string.Format("{0}\\MapRoute.config", Tension.ServerInfo.GetRootPath()));
}
///
/// 从string动态创建类对象
///
///
///
///
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#
///
/// ///
private static IList
{
StringBuilder sb = new StringBuilder();
Console.WriteLine(sb.ToString());
IList
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
#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;
}
}
///
public class Route {
public string Name { get; set; }
public string Url { get; set; }
public Dictionary
///
/// ///
{
StringBuilder sb = new StringBuilder();
sb.
相关文章
相关下载
网友评论