在.Net3.5SP1中,新增加了一个DLL:System.Web.Routing,只要我们在项目中添加该引用,那么就可以实现如MVC项目中的路由选择。

 

 public class Global : System.Web.HttpApplication {

  protected void Application_Start(object sender, EventArgs e)
        {
   RegisterRoutes(RouteTable.Routes);
  }

        /// <summary>
        /// 添加路由规则
        /// </summary>
        /// <param name="routes">路由集合</param>
  public static void RegisterRoutes(RouteCollection routes)
        {
   routes.Add(new Route("{resource}.axd/{*pathInfo}", new StopRoutingHandler()));
            routes.Add("webforms", new Route("{controller}/{action}.aspx", new RouteValueDictionary(new { controller = "Account", action = "ViewPage1" }), new RouteHandler()));
  }

        /// <summary>
        /// 实现路由规则
        /// 这里有俩种方式:第一种方式直接通过System.Web.Compilation.BuildManager来创建返回一个IHttpHandler;
        /// 第二种方式将请求上下文交给一个继承自IHttpHandler的类来处理
        /// </summary>
        public class RouteHandler : IRouteHandler
        {

            #region IRouteHandler Members

            public IHttpHandler GetHttpHandler(RequestContext requestContext)
            {
                return new PageHandler(requestContext);
                //Route route = (Route)requestContext.RouteData.Route;
                //string path = "/" + route.Defaults["Controller"] + "/" + route.Defaults["action"] + ".aspx";
                //IHttpHandler hander = BuildManager.CreateInstanceFromVirtualPath(path, typeof(System.Web.UI.Page)) as IHttpHandler;
                //return hander;
            }

            #endregion
        }

        public class PageHandler : IHttpHandler
        {
            public RequestContext requestContext { get; set; }
            public PageHandler(RequestContext context)
            {
                this.requestContext = context;
            }

            #region IHttpHandler Members

            public bool IsReusable
            {
                get { return false; }
            }

            public void ProcessRequest(HttpContext context)
            {
                Route route = (Route)requestContext.RouteData.Route;
                RouteValueDictionary routeVale = requestContext.RouteData.Values;
                string path = string.Format("/Views/{0}/{1}.aspx",
                                                     routeVale.ContainsKey("controller")
                                                        ? route.Defaults["controller"]
                                                        : routeVale["controller"],
                                                     routeVale.ContainsKey("action")
                                                        ? route.Defaults["action"]
                                                        : routeVale["action"]);
                context.Server.Execute(path);
            }

            #endregion
        }
 }

 

posted on 2009-12-24 16:03  yo  阅读(234)  评论(0编辑  收藏  举报