当前位置: 首页 > 编程日记 > 正文

一步步学会使用ASP.NET 4 WEB应用程序中使用URL Routing(翻译)

创建路由


路由就是将URL路径映射到具体的物理文件。若要将路由添加到网站中,请使用 RouteCollection.MapPageRoute 方法将它们添加到RouteTable类的静态Routes属性。

将用于添加路由的方法添加到 Global.asax 文件中
  1. 如果网站还没有 Global.asax 文件,请通过执行下列步骤添加一个这样的文件:

    1. 右击“解决方案资源管理器”中的 Web 项目,然后选择“添加新项”。

    2. 选择“全局应用程序类”,再单击“添加”。

  2. 打开 Global.asax 文件。

  3. 在Application指令的后面,添加用于System.Web.Routing命名空间的Import指令,如下面的示例所示:

    <%@ Import Namespace="System.Web.Routing" %>
  4. 在 Session_End方法的后面添加以下代码:

    void RegisterRoutes(RouteCollection routes)
    {
    }

    在下面的过程中,您将向此方法中添加用于创建路由的代码。

  5. 在 Application_Start 方法中,调用RegisterRoutes添加路由规则,如下面的示例所示:


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

上面的过程添加了用于注册路由的空方法。现在,将使用此方法将路由添加到网站中。

添加路由
  1. 在 RegisterRoutes 方法中,添加以下代码:

    routes.MapPageRoute("",
        "SalesReportSummary/{year}",
        "~/sales.aspx");

    此代码添加了一个未命名的路由,该路由具有URL匹配模式,该模式包含文本值“SalesReportSummary”和名为year的占位符(URL参数)。它将路由映射到名为 Sales.aspx 的文件。

  2. 在 RegisterRoutes 方法中,添加以下代码:

    routes.MapPageRoute("SalesRoute",
        "SalesReport/{locale}/{year}",
        "~/sales.aspx");

    此代码添加名为SalesRoute的路由。如果对路由规则进行了命名,那么在下面创建了相同的路由规则的时候,可以使用名称区分它们。

  3. 在 RegisterRoutes 方法中,添加以下代码:

    routes.MapPageRoute("ExpensesRoute",
        "ExpenseReport/{locale}/{year}/{*extrainfo}",
        "~/expenses.aspx", true,
        new RouteValueDictionary { 
            { "locale", "US" }, 
            { "year", DateTime.Now.Year.ToString() } },
        new RouteValueDictionary { 
            { "locale", "[a-z]{2}" }, 
            { "year", @"\d{4}" } });

    此代码添加名为 ExpensesRoute 的路由。此路由包括一个普通匹配参数 extrainfo。此代码将 locale 参数的默认值设置为“US”,将 year 参数的默认值设置为今年。约束指定 locale 参数必须由两个字母字符组成year 参数必须由四个数字组成。

使用路由创建超链接


当向网页中添加超链接时,如果希望指定路由 URL 而不是物理文件,则您有两个选择:

  • 可以对路由URL进行硬编码。

  • 可以指定路由参数名称和值,并让 ASP.NET 生成对应的 URL。如有必要,还可以指定路由名称,以便唯一标识路由。如果稍后更改路由URL规则,则必须更新所有硬编码的URL,但是如果让 ASP.NET生成URL,则始终自动生成正确的URL(除非模式中的参数已更改)。

在下面的过程中,将使用硬编码 URL 的超链接添加到网页。

创建硬编码的 URL
  1. 在“Solution”中,右击 Web 项目,然后单击"Add Item”。

    显示"Add Item”对话框。

  2. 选择“Web 窗体”模板,确保选中“Place code in separate file”,将名称设置为“Links.aspx”,然后单击“添加”。

    即会在“源”视图中打开Links.aspx页。

  3. 在开始和结束 <div> 标记之间添加以下标记:

    <asp:HyperLink ID="HyperLink1" runat="server" 
        NavigateUrl
    ="~/salesreportsummary/2010">
        Sales Report - All locales, 2010
    </asp:HyperLink>
    <br />
    <asp:HyperLink ID="HyperLink2" runat="server" 
        NavigateUrl
    ="~/salesreport/WA/2011">
        Sales Report - WA, 2011
    </asp:HyperLink>
    <br />
    <asp:HyperLink ID="HyperLink3" runat="server" 
        NavigateUrl
    ="~/expensereport">
        Expense Report - Default Locale and Year (US, current year)
    </asp:HyperLink>
    <br />

    此标记中使用硬编码URL创建三个HyperLink控件。第一个超链接匹配销售情况汇总路由的URL模式,第二个超链接匹配名为 SalesRoute 的路由,第三个超链接匹配名为ExpensesRoute 的路由。由于没有为第三个超链接的 URL 指定参数,为该路由定义的默认值将传递给Expenses.aspx。

接下来,将添加标记(这些标记创建用于指定路由参数和路由名称的超链接)以创建路由URL。

使用标记创建自动生成的URL
  • 在“源”视图中保持Links.aspx 打开,在上一过程中创建的HyperLink控件后添加以下代码:

    <asp:HyperLink ID="HyperLink4" runat="server" 
        NavigateUrl
    ="<%$RouteUrl:year=2011%>">
        Sales Report - All locales, 2011
    </asp:HyperLink>
    <br />
    <asp:HyperLink ID="HyperLink5" runat="server" 
        NavigateUrl
    ="<%$RouteUrl:locale=CA,year=2009,routename=salesroute%>">
        Sales Report - CA, 2009
    </asp:HyperLink>
    <br />

    此标记使用 RouteUrl 表达式创建名为SalesSummaryRoute和SalesRoute的URL。第二个 RouteUrl 表达式指定路由的名称,因为代码中提供的参数列表可以匹配 ExpensesRoute URL模式或 SalesRoute URL模式。ExpensesRoute URL 模式具有 SalesRoute URL模式所没有的 extrainfo 占位符,但是 extrainfo 是一个可用于放置各种信息的占位符,这意味着它是可选的。

在下面的过程中,将添加用于创建超链接的标记,并通过指定路由参数和路由名称,使用代码生成超链接的 URL。

使用代码创建自动生成的 URL
  1. 在“源”视图中保持 Links.aspx 打开,在上一过程中创建的 HyperLink控件后添加以下代码:

    <asp:HyperLink ID="HyperLink6" runat="server">
        Expense Report - CA, 2008
    </asp:HyperLink>
    <br />

    此标记不设置 NavigateUrl 属性,因为该属性将在代码运行时生成。

  2. 在“Solution”中,展开 Links.aspx,然后打开 或 Links.aspx.cs。

  3. 为 System.Web.Routing命名空间添加 using 语句,如下面的示例所示:

    using System.Web.Routing;
  4. 在Page_Load方法中,添加以下代码:


    此代码创建包含三个参数的 RouteValueDictionary 类的实例。第三个参数为 category,它不在 URL 模式中。由于它不在 URL 模式中,category 参数及其值将呈现为查询字符串参数。

  5. 在上一步中添加的代码后面,添加以下代码:

    VirtualPathData vpd = 
        RouteTable.Routes.GetVirtualPath(null, "ExpensesRoute", parameters);

    此代码通过调用RouteCollection类的GetVirtualPath方法,实例化VirtualPathData对象。由于 SalesRoute URL 模式和 ExpensesRoute URL 模式具有相似的占位符,因此它调用接受路由名称并指定 ExpensesRoute 值的重载。

  6. 在上一步中添加的代码后面,添加以下代码以设置超链接的 NavigateUrl 属性:

    HyperLink6.NavigateUrl = vpd.VirtualPath;

在 ASP.NET 页中访问 URL 参数值


在 ASP.NET 路由已调用的 ASP.NET 页中,可以在标记或代码中检索 URL 参数的值。例如,SalesReport 路由包括名为 locale 和 year 的参数,当收到匹配此模式的 URL 请求时,Sales.aspx 页中的代码可能需要将这些参数的值传递给 SQL 查询。

在下面的过程中,将使用标记访问 URL 参数值。此方法可用于在网页中显示参数值。

使用标记访问 URL 参数值
  1. 右击 Web 项目,然后单击“添加新项”。

    显示“添加新项”对话框。

  2. 选择 Web 窗体模板,然后将名称设置为“Expenses.aspx”。

    即会在“源”视图中打开 Expenses.aspx 页。

  3. 在开始和结束 <div> 标记之间添加以下标记:

    <h1>
        Expense Report for
        
    <asp:Literal ID="Literal1" 
          Text
    ="<%$RouteValue:locale%>" 
          runat
    ="server"></asp:Literal>,
        
    <asp:Literal ID="Literal2" 
          Text
    ="<%$RouteValue:year%>" 
          runat
    ="server"></asp:Literal>
    </h1>


    此标记使用 RouteValue 表达式提取并显示传递到页面的 URL 参数的值。

在下面的过程中,将使用代码访问参数值。此方法在您必须以某种方式(例如通过按此过程所示将 null 值转换为默认值,或通过将信息传递给 SQL 查询)处理数据时非常有用。

使用代码访问 URL 参数值
  1. 右击 Web 项目,然后单击“Add New Item”。

    显示“New Item”对话框。

  2. 选择“Web 窗体”模板,确保选中“将代码放在单独的文件中”,将名称设置为“Sales.aspx”,然后单击“添加”。

    即会在“源”视图中打开 Sales.aspx 页。

  3. 在开始和结束 <div> 标记之间添加以下标记:

    <h1>
        Sales Report for
        
    <asp:Literal ID="LocaleLiteral" runat="server"></asp:Literal>,
        
    <asp:Literal ID="YearLiteral" runat="server"></asp:Literal>
    </h1>


    此标记包括 Literal 控件,但不设置其 Text 属性,因为将在代码中设置这些属性。

  4. 在“Solution”中,展开 Sales.aspx,然后打开Sales.aspx.cs。

  5. 在 Page_Load 方法中,添加以下代码,将第一个 Literal 控件的 Text 属性设置为下列值之一:

    • 文本“所有区域设置”(如果 locale 参数为 null)。

    • locale 参数的值(如果 locale 参数不为 null)。

      LocaleLiteral.Text = Page.RouteData.Values["locale"] == null ?
      "All locales" : Page.RouteData.Values["locale"].ToString();
  6. 在 Page_Load 方法中,添加以下代码,以将第一个Literal控件的Text 属性设置为 year URL 参数的值:

    YearLiteral.Text = Page.RouteData.Values["year"].ToString();

测试路由


现在,可以测试路由。

测试路由
  1. 在“解决方案资源管理器”中右击 Links.aspx,并选择“在浏览器中查看”。

    该页将在浏览器中显示,如下图所示:

    Links.aspx 页面的屏幕快照

  2. 单击每个超链接。

    请注意,每个超链接转到一个其标题对应于该超链接的文本的页面。

  3. 回到 Links.aspx 页,选择浏览器的“查看源”命令,检查最后三个超链接的 URL。

    您将看到下面的自动生成的 URL:

    • http://[server]/[application]/SalesReportSummary/2011

    • http://[server]/[application]/SalesReport/CA/2009

    • http://[server]/[application]/ExpenseReport/CA/2008?category=recreation

  4. 将以 SalesReport/CA/2009 结束的 URL 复制到 Windows 剪贴板,然后关闭“查看源”窗口。

  5. 将该 URL 粘贴到浏览器的地址栏中,将 CA 更改为“invalidlocale”,将 2009 更改为“invalidyear”,然后按 Enter。

    将显示类似下图的页面:

    显示无效参数值的 SalesReport.aspx

    您可以看到显示 invalidlocale 和 invalidyear 值的销售报表页。由于没有为 SalesRoute 路由指定任何约束,因此接受无效数据。

  6. 再次将该 URL 粘贴到浏览器的地址栏中,将 CA 更改为“invalidlocale”,将 2009 更改为“invalidyear”,将 SalesReport 更改为“ExpenseReport”,然后按 Enter。

    将显示类似下图的页面:

    当费用报表 URL 违反约束时的错误

    由于 URL 未解析为路由,您会看到“未找到”错误。ExpenseReport 路由将仅接受具有两个字母字符的 locale 参数和具有四位数字的 year 参数。

原文链接

延伸阅读

ASP.NET 4新增功能(一) ASP.NET核心服务

ASP.NET 4新增功能(二) ASP.NET Web 窗体增强功能

ASP.NET 4新增功能(三) 对Web标准的支持和辅助功能的增强

ASP.NET 4新增功能(四) 其它新功能及VS 2010对ASP.NET 4的支持改进(完)

转载于:https://www.cnblogs.com/longgel/archive/2010/06/05/1752239.html

相关文章:

Properties持久的属性集

Properties 属性集合继承了Hashtable 属性包括属性名和属性值&#xff08;键值对keyvalue&#xff09; 作用 可以存储多个键值&#xff0c;与map相似可以把键值对存储到文件中可以把文件中的键值对读取到Properties对象中 构造方法&#xff1a; Properties() 创建一个无默认…

让你二十年后仍是人才

1.不管坐什么位置&#xff0c;都要保持学习的习惯出社会工作十年到十五年左右&#xff0c;会有一种「上下卡住」的闭塞感与无力感。因为&#xff0c;这个阶段的上班族虽然拥有一定的资历与经验&#xff0c;工作也得心应手&#xff0c;但上面有比自己更资深的前辈压着&#xff0…

Django ORM操作

Django ORM操作 一般操作 看专业的官网文档&#xff0c;做专业的程序员&#xff01; 必知必会13条 <1> all(): 查询所有结果<2> get(**kwargs): 返回与所给筛选条件相匹配的对象&#xff0c;返回结果有且只有一个&#xff0c;如果符合筛选…

ChineseCalendar类[转]

///<summary>///Title: ChineseCalendar类 ///Description: 中文日期工具类 ///author 万灵杰[作者] ///version 1.0.0.0 ///date 2009年7月30日 ///modify ///date ///</summary>publicclassChineseCalendar { privatestaticrea…

程序员的自我救赎---13.1:职场招聘与面试心得

《前言》 《目录》 &#xff08;一&#xff09; Winner2.0 框架基础分析 &#xff08;二&#xff09;PLSQL报表系统 &#xff08;三&#xff09;SSO单点登录 &#xff08;四&#xff09; 短信中心 &#xff08;五&#xff09;钱包系统 &#xff08;六&#xff09;GPU支付中心 &…

网络编程 UDP通信的过程 TCP通信过程 多线程文件上传

网络概述 协议 在网络之间传出数据时需要按照指定的标准来传输&#xff0c;标准中规定了数据的格式、大小、传输的方式、传输速率。形成统一规范—>按照规范开发的代码—>协议&#xff08;应用层、传输层、网络层、链路层&#xff09; InetAddress类 用来分装网络地址…

set debug mode for flex builder

1. 要具备debug功能&#xff0c;我们必须要首先安装Flash Player Debug 版本。windows版本2. 安装好debug版本后&#xff0c;我们还需要添加日志的配置文件mm.cfg。该配置文件存放的目录如下&#xff1a;Macintosh OS X MacH D:Library:Application Support:macromedia:mm.cfgM…

XML 解析XML文档 XML约束

XML 什么是XML Extensible Markup Language&#xff08;可扩展的标记语言&#xff09;他是一个语言&#xff0c;有自己的语法&#xff0c;和Java以及其他的编程无关“标记” 在文件中包含类似于张三 &#xff0c;这种用尖括号括起来的叫标记&#xff0c;使用来标记数据的。标…

Host Only、NAT和Bridge三种网络连接

Host Only、NAT和Bridge三种网络连接 在安装好了Linux镜像之后&#xff0c;如何连接物理机和虚拟机呢&#xff1f;这就需要网络连接&#xff0c;网络连接有三种&#xff1a;HostOnly、NAT、Bridge&#xff0c;它们都可用于Guest虚拟机和Host物理机之间的网络通信。 一、三者的不…

OSPF 提升 一 ----基础

ospf ccnp内容 一 link-state protocols IGP 开放式的最短路径优先协议 公有协议支持中到大型的网络 spf算法 链路状态协议1.传送的LSA link status advertisement 链路状态通告 包换拓扑信息具体包括&#xff1a;网段的前缀 掩码 连接的路由器的…

C#实现网页截图功能

//需要添加System.Drawing及System.Windows.Forms引用 using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Windows.Forms; namespace 网页截图 { class Program { [S…

微软发布全新多核心操作系统原型:Barrelfish

Windows 7完成之后&#xff0c;很多人开始把目光投向微软的下一代服务器和客户端操作系统Windows 8&#xff0c;不过今天微软放出了一套全新操作系统的原型&#xff0c;开发代号“Barrelfish”。该系统由微软剑桥研究院和苏黎世理工学院联合全新开发&#xff0c;专为现在和未来…

Docker应用:Kubernetes(容器集群)

Docker应用&#xff1a;Kubernetes&#xff08;容器集群&#xff09; 原文:Docker应用&#xff1a;Kubernetes&#xff08;容器集群&#xff09;阅读目录&#xff1a; Docker应用&#xff1a;Hello WorldDocker应用&#xff1a;Docker-compose&#xff08;容器编排&#xff09;…

通道应用——抠头发

通道应用——抠头发 原图&#xff1a; 效果图&#xff1a; 步骤&#xff1a;1、打开原图的“通道面板”&#xff0c;选择颜色对比分明的绿色通道&#xff0c;并新建一个绿色通道副本&#xff1b;2、选择“图像”-“调整”-“色阶”&#xff0c;调节色阶使得头发颜色更分明些&am…

2017 ACM/ICPC 南宁赛区小结 By JSB @ Reconquista

Statistics TYPE: Onsite ContestNAME: 2017 - ICPC - Asia NanningPLAT: pc^2TIME: 2017/11/26 09:00-14:00LOCA: Guangxi UniversityTEAM: Reconquista[shb,lsmll,jsb]RANK: 8/227 3.52%SOLVE: 8/13PENALTY: 451 ◦ A - 1 ◦ E - 123 (2) ◦ F - 8 ◦ H - 55 ◦ I - 97 (1) ◦…

用户管理系统控制台版连接数据库

建User表 CREATE TABLE user (id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(20) DEFAULT NULL,pwd VARCHAR(20) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEINNODB AUTO_INCREMENT5 DEFAULT CHARSETutf8User对象&#xff08;javaBean&#xff09; public class User {priva…

微信小程序组件 日历

js文件 use strict;let choose_year null,choose_month null;const conf {data: {hasEmptyGrid: false,showPicker: false},onLoad() {const date new Date();const cur_year date.getFullYear();const cur_month date.getMonth() 1;const weeks_ch [ 日, 一, 二, 三, …

node编写定时任务,for循环只执行一遍的解决办法

在用node编写定时任务时候&#xff0c;发现for循环只执行i0这一次&#xff0c;就不接着循环执行了&#xff0c;下面贴上代码&#xff1a; exports.task async function(ctx){ let { app } ctx, resultArr1 [],//查询的数据库数据 resultArr2 [];//查询的数据库…

oledb读不到dbf文件内容

最近在处理一批VFP的数据库&#xff0c;使用OleDB方式读取一直很正常&#xff0c;前两天突然碰到一张表怎么也读不出数据来&#xff0c;害我瞎忙了一整天&#xff0c;在研究了DBF文件结构后发现记录前的0x20位置存储的是0x2A。 一查才知道是删除标记&#xff0c;我倒&#xff0…

好用的截图工具

好用的截图工具...简单好用而且不大转载于:https://blog.51cto.com/dd123/208983

“AS3.0高级动画编程”学习:第二章转向行为(上)

因为这一章的内容基本上都是涉及向量的&#xff0c;先来一个2D向量类&#xff1a;Vector2D.as (再次强烈建议不熟悉向量运算的童鞋&#xff0c;先回去恶补一下高等数学-07章空间解释几何与向量代数.pdf) package {import flash.display.Graphics;public class Vector2D {privat…

用Azure VM + Azure Database for MySQL搭建Web服务

仍然是一篇动手实验&#xff0c;实验演示如何在Azure的虚拟机内部署一个Web服务器&#xff0c;并且使用Azure Mysql PaaS作为本应用的数据库。此实验的目的一方面是为了演示Azure IaaS层和PaaS服务配合使用的常规操作&#xff0c;另一方面是为之后的文章打基础&#xff0c;后续…

C3P0_and_pro.properties配置文档代码

C3P0-config.xml配置文件 <c3p0-config> <!-- 默认配置&#xff0c;如果没有指定则使用这个配置 --> <default-config><property name"driverClass">com.mysql.jdbc.Driver</property><property name"jdbcUrl">jdbc:…

电视信号——行场同步

电视信号分NTSC制和PAL制两种制式, NTSC制每秒刷新60次, 而PAL制每秒刷新50次。 水平消隐&#xff1a;电子枪从左到右画出象素&#xff0c;它每次只能画一条扫描线&#xff0c;画下一条之前要先回到左边并做好画下一条扫描线的准备&#xff0c;这之间有一段时间叫做水平消隐&am…

QWidget一生,从创建到销毁事件流

版权声明&#xff1a;若无来源注明&#xff0c;Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址&#xff1a;本文标题&#xff1a;QWidget一生&#xff0c;从创建到销毁事件流 本文地址&#xff1a;http://techieliang.com/2017/11/319/ 代码较多&#xff…

事物_软件分层

事务 事务是&#xff1a;在数据库指业务处理的”一个业务“对应数据库中的多个步骤的操作。例如银行转账。 面对的问题&#xff1a;程序接受请求后&#xff0c;会至少发送两条SQL语句&#xff0c;两条语句之间会有时间的间隔&#xff0c;如果间隔时间期间Mysql服务器发生意外&a…

雷林鹏分享:jQuery EasyUI 数据网格 - 创建属性网格

jQuery EasyUI 数据网格 - 创建属性网格 属性网格(property grid)带有一个内置的 expand(展开)/collapse(合并) 按钮&#xff0c;可以简单地为行分组。您可以简单地创建一个可编辑属性的分层(hierarchical)列表。 设置 HTML url"propertygrid_data.json" showGroup&q…

as3.0中如何阻止事件冒泡?

as3.0中的事件冒泡机制有时候会很烦人&#xff0c;比如一个Sprite(方便下文描述就命名为Container吧)把另一外Sprite(称为Child吧)做为子元素套进来以后&#xff0c;如果两个Sprite都注册了Mouse_Down事件&#xff0c;要想在Child上点击鼠标时系统只响应Child的Mouse_Down事件&…

紫色回归线:雅虎中国的运筹学

共同体并不意味着一个我们可以获得享受的世界&#xff0c;而是一个我们热切希望栖息、希望重新拥有的世界。—— 齐格蒙特.鲍曼紫色回归线&#xff1a;雅虎中国的运筹学紫色是比较中性的颜色&#xff0c;但紫色在生活中却也是温柔、神秘、甚至性感的代词。当雅虎中国将主色调重…

JavaScript_上

javaScript JavaScript,简称JS&#xff0c;是Web开发中不可缺少的脚本语言的&#xff0c;不需要编译就可以运行&#xff08;解释性语言&#xff09;。它“寄生”在HTML体内&#xff0c;随网络传输到客户端在浏览器中运行。js代码可以写到html的任何地方。一般写在 body 结束标签…