在 ASP.NET 网页 (Razor) 网站中创建可读 URL

作者 Tom FitzMacken

本文介绍 ASP.NET 网页 (Razor) 网站中的路由,以及如何让你使用更易于阅读、更适合 SEO 的 URL。

学习内容:

  • ASP.NET 如何使用路由来使用更具可读性和可搜索性 URL。

本教程中使用的软件版本

  • ASP.NET 网页 (Razor) 3

本教程也适用于 ASP.NET 网页 2。

关于路由

网站中页面的 URL 可能会影响网站的工作方式。 “友好”的 URL 可以使用户更轻松地使用该网站。 它还可以帮助网站的搜索引擎优化 (SEO) 。 ASP.NET 网站包括自动使用友好 URL 的功能。

ASP.NET 允许你创建描述用户操作的有意义的 URL,而不仅仅是指向服务器上的文件。 请考虑以下虚构博客的 URL:

  • http://www.contoso.com/Blog/blog.cshtml?categories=hardware
  • http://www.contoso.com//Blog/blog.cshtml?startdate=2009-11-01&enddate=2009-11-30

将这些 URL 与以下 URL 进行比较:

  • http://www.contoso.com/Blog/categories/hardware/
  • http://www.contoso.com/Blog/2009/November

在第一对中,用户必须知道博客是使用 blog.cshtml 页面显示的,然后必须构造一个查询字符串来获取正确的类别或日期范围。 第二组示例更易于理解和创建。

第一个示例的 URL 还直接指向 blog.cshtml) (特定文件。 如果由于某种原因将博客移动到服务器上的另一个文件夹,或者博客被重写为使用其他页面,则链接将出错。 第二组 URL 不指向特定页面,因此,即使博客实现或位置发生更改,这些 URL 仍然有效。

在 ASP.NET 网页 中,可以创建类似于上述示例中的友好 URL,因为 ASP.NET 使用路由。 路由创建从 URL 到满足请求的页面 (或页) 的逻辑映射。 由于映射是逻辑 (非物理映射,因此,到特定文件) ,路由在定义站点 URL 的方式方面提供了极大的灵活性。

路由的工作原理

ASP.NET 处理请求时,它会读取 URL 以确定如何路由该请求。 ASP.NET 尝试从左到右将 URL 的各个段与磁盘上的文件匹配。 如果有匹配项,URL 中剩余的任何内容将作为 路径信息传递到页面。

假设有人使用此 URL 发出请求:

http://www.contoso.com/a/b/c

搜索如下所示:

  1. 是否有路径和名称为 /a/b/c.cshtml 的文件? 如果是,请运行该页面,不向其传递任何信息。 否则...
  2. 是否有路径和名称为 /a/b.cshtml 的文件? 如果是,请运行该页并将值 c 传递给它。 否则。。。
  3. 是否有路径和名称为 /a.cshtml 的文件? 如果是,请运行该页并将值 b/c 传递给它。

如果搜索找不到指定文件夹中 .cshtml 文件的完全匹配项,ASP.NET 继续依次查找这些文件:

  1. /a/b/c/default.cshtml (无路径信息) 。
  2. /a/b/c/index.cshtml (未) 路径信息。

注意

为清楚起见,对特定页面的请求 (即,包含 .cshtml 文件扩展名) 的请求的工作方式与预期一样。 像 这样的 http://www.contoso.com/a/b.cshtml 请求将正常运行页面 b.cshtml

在页面中,可以通过页面的 UrlData 属性(字典)获取路径信息。 假设你有一个名为 ViewCustomers.cshtml 的文件,并且站点收到此请求:

http://mysite.com/myWebSite/ViewCustomers/1000

如上述规则中所述,请求将转到你的页面。 在页面内,可以使用如下所示的代码来获取并显示路径信息,在本例中 (值“1000”) :

<!DOCTYPE html>
<html>
    <head>
        <title>URLData</title>
    </head>
    <body>
      Customer ID: @UrlData[0].ToString()
    </body>
</html>

注意

由于路由不涉及完整的文件名,因此,如果页面具有相同的名称但文件扩展名不同, (例如 MyPage.cshtmlMyPage.html) ,则可能存在歧义。 为了避免路由问题,最好确保网站中没有名称仅在扩展名上不同的页面。

其他资源

WebMatrix - SEO 的 URL、UrlData 和路由。 这篇由 Mike Brind 撰写的博客文章提供了一些有关路由在 ASP.NET 网页 中工作原理的其他详细信息。