当前位置导航:炫浪网>>网络学院>>网页制作>>ASP.NET教程

浅析ASP.NET MVC路由规则XML化的方法

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

  }

 

 

相关内容
赞助商链接