码迷,mamicode.com
首页 > Web开发 > 详细

学习ASP.NET MVC5框架揭秘笔记-ASP.NET MVC路由(二)

时间:2015-05-31 23:21:31      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:.net   asp.net   mvc   

2.2.2 路由注册

ASP.NET MVC通过调用代表全局路由表的RouteCollection对象的扩展方法MapRoute进行路由注册。我们来进行一个简单的实例演示。我们依然沿用之前关于获取天气信息的路由模板,看看通过这种方式注册的Route对象针对匹配的请求将返回怎样一个RouteData对象。

我们创建一个空的ASP.NET Web程序,并手动添加“System.Web.Mvc.dll”和“System.Web.WebPages.Razor.dll”的引用。然后添加如下一个页面(Default.aspx,并按照之前的做法以内联的方式直接将RouteData的相关属性显示出来。我们显示的RouteData是通过调用自定义的GetRouteData方法来获取的,而不是当前页面的RouteData属性返回的RouteData对象。

<form id="form1" runat="server">
        <div>
            <table class="table table-bordered">
                <tr>
                    <td>Route:</td>
                    <td><%=GetRouteData().Route != null? GetRouteData().Route.GetType().FullName:"" %></td>
                </tr>
                <tr>
                    <td>RouteHandler:</td>
                    <td><%=GetRouteData().RouteHandler != null? GetRouteData().RouteHandler.GetType().FullName:"" %></td>
                </tr>
                <tr>
                    <td>Values:</td>
                    <td>
                        <ul>
                             <%foreach (var variable in GetRouteData().Values)
                               {%>
                             <li>
                                  <%=variable.Key%>=<%=variable.Value%></li>
                             <% }%>
                        </ul>
                    </td>
                </tr>
                <tr>
                    <td>DataTokens:</td>
                    <td>
                        <ul>
                             <%foreach (var variable in GetRouteData().DataTokens)
                               {%>
                             <li>
                                 <%=variable.Key%>=<%=variable.Value%></li>
                             <% }%>
                        </ul>
                    </td>
                </tr>
            </table>
        </div>
    </form>

我们将GetRouteData方法定义在当前页面的后台代码中。如下面的代码片段所示,我们根据手工创建的HttpRequest(请求URL为“http://localhost/0512/3)HttpResponse对象创建了一个HttpContext对象,然后以此创建一个HttpContextWrapper对象。接下来我们利用RouteTable的静态属性Routes获取代表全局路由表的RouteCollection对象,并将这个HttpContextWrapper对象作为参数调用其GetRouteData方法。这个方法实际上就是模拟注册的路由表针对相对地址为“/0512/3”的请求的路由解析。

ublic partial class Default : System.Web.UI.Page
    {
        private RouteData routeData;
        public RouteData GetRouteData()
        {
            if (null != routeData)
            {
                return routeData;
            }
            HttpRequest request = new HttpRequest("default.aspx", "http://localhost/0512/3", null);
            HttpResponse response = new HttpResponse(new StringWriter());
            HttpContext context = new HttpContext(request, response);
            HttpContextBase contextWrapper = new HttpContextWrapper(context);
            return routeData = RouteTable.Routes.GetRouteData(contextWrapper);
        }
    }


具体的路由注册依然定义在添加的Global.asax文件中。如下面的代码所示,我们利用RouteTable的静态属性Routes获取代表全局路由表的RouteCollection对象,然后调用其MapRoute方法注册了一个采用“{areacode}/{days}”作为路由模板的Route对象,并指定了变量的默认值、约束和命名空间列表。由于成功匹配的路由对象必须具有一个名为“controller”的路由变量,我们直接将controller的默认值设置为“home”。

public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            object defaults = new
            {
                areacode = "010",
                days = 2,
                defaultCity = "BeiJing",
                defaultDays = 2,
                controller = "Home"
            };
            object constraints = new { areacode = @"0\d{2,3}", days = @"[1-3]" };
            string[] namespaces = new string[] { "Artech.Web.Mvc", "Artech.Web.Mvc.Html" };
            RouteTable.Routes.MapRoute("default", "{areacode}/{days}",defaults, constraints, namespaces);
        }
    }


学习ASP.NET MVC5框架揭秘笔记-ASP.NET MVC路由(二)

标签:.net   asp.net   mvc   

原文地址:http://blog.csdn.net/yejinwei1220/article/details/46292737

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!