由于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);
}