zoukankan      html  css  js  c++  java
  • 在ASP.NET Web Forms中使用ASP.NET Routing模块

    ASP.NET Routing是随着MVC框架一起发布的,目前主要使用在MVC框架和Dynamic Data Web Application中。但这并不代表在标准的Web Forms中就不能使用这个模块。下面我就以一个实例的方式带领大家了解这个模块的简要使用步骤。

    注:所谓Routing指的是地址的路由,早年微软有一个UrlRewriting的范例。现在算是真正做到了Framework级别的支持了。

    1. 创建一个新的Web应用程序

    image

    2.添加引用

    image

    3. 修改配置文件,添加一个模块的支持

    image

    4. 添加Routing规则

    首先我们需要添加一个global.asax文件

    image

    我们需要在global.asax中注册路由规则。大致是下面这样的语法

        public class Global : System.Web.HttpApplication
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.Add(
                    new Route("Product/{ProductName}", new MyRouteHandler()));
    
    
            }
            protected void Application_Start(object sender, EventArgs e)
            {
                RegisterRoutes(RouteTable.Routes);
            }
    
        }

    定义路由规则中,凡是可变的部分都用{}包含起来,例如上面的ProductName就表示这是一个变量。

    路由规则匹配之后,Routing组件会把请求转交给我们一个自定义的RouteHandler来处理,所以我们要定义这个Handler

        public class MyRouteHandler : IRouteHandler
        {
    
            #region IRouteHandler 成员
    
            public IHttpHandler GetHttpHandler(RequestContext requestContext)
            {
                string productName = requestContext.RouteData.GetRequiredString("ProductName");
                return new MyPageHandler() { ProductName = productName };
            }
    
            #endregion
        }
    这里我们通过GetRequiredString的方式取得那个具体的ProductName,然后我们再次转交给一个特定的HttpHandler来处理。所以我们又要定义这个HttpHandler
       public class MyPageHandler : IHttpHandler
        {
    
            #region IHttpHandler 成员
    
            public bool IsReusable
            {
                get { return false; }
            }
    
            public void ProcessRequest(HttpContext context)
            {
                context.Response.Write(string.Format("当前请求的产品是:{0}", ProductName));
            }
    
            public string ProductName { get; set; }
    
            #endregion
        }

    到这里为止,我们就完成了所有的操作,虽然功能很简单。但流程已经很完整了,现在可以马上来看看效果

    image

    image

    请大家注意,我们在网站中并没有所谓的Product目录,也不可能存在所谓的Car目录或者页面。这就是Routing的厉害之处。

    实际上,我们如果设置两个断点,就可以看到中间的工作过程

    image

    读者可能会说,如果在这个MyPageHandler里面这样处理是不是太难了些。我们需要根据参数的不同,去显示不同的页面内容呢?

    实际上,很简单,我们可以添加一个Product的页面

    image

    image

    注:出于简单的考虑,我们这里只是显示一个产品名称。只要你愿意,你当然可以根据它查询数据库,并作任意复杂的数据绑定和展现。

    接下来,修改一下我们的PageHandler

    image

    实际上,我们将地址处理成了标准的Product.aspx?ProductName=Car这样的格式。但是用户是看不到的,因为我们是用Server.Transfer,而不是Response.Redirect

    image

    我们发现它依然能很好地进行工作。鼓掌~

    注:这里还要注意一个问题,因为是重定向到了其他的路径,实际上又是一个Request,这一点上是不如MVC的,因为MVC框架下只要接管到了请求,直接就可以通过创建Controller去执行某个Action即可。

    最后,假设我们希望给路径设置一个默认值,例如如果请求/Product,没有提供具体的ProductName的话,我们认为是请求所有页面。这要如何实现呢

    image

    image

  • 相关阅读:
    P4005 小 Y 和地铁
    P1039 侦探推理
    P2766 最长不下降子序列问题
    P2312 解方程
    P2169 正则表达式
    UOJ#22. 【UR #1】外星人
    UOJ#21. 【UR #1】缩进优化
    Palindromeness CodeChef
    bzoj5392 [Lydsy1806月赛]路径统计
    997D Cycles in product
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1633265.html
Copyright © 2011-2022 走看看