1

在我的 ASP.NET WebForm 应用程序中,我有简单的规则:

routes.MapPageRoute("RouteSearchSimple", "search/{SearchText}", "~/SearchTicket.aspx");

作为“SearchText”参数,我需要使用西里尔字母,所以要创建 Url,我使用:

string searchText = "текст";
string url = Page.GetRouteUrl("RouteSearchSimple",
            new
            {
                SearchText = searchText
            });

GetRouteUrl 自动编码 searchText 值,结果 url = /search/%D1%82%D0%B5%D0%BA%D1%81%D1%82

但我需要 -> /search/текст

如何通过 Page.GetRouteUrl 函数获取它。

非常感谢!

4

3 回答 3

2

实际上,我相信 Alexei Levenkov 已经接近答案。最终,一个 URL 可能只包含 ASCII 字符,因此除了字母数字字符之外的任何内容都将被 URL 编码(甚至像空格这样的东西)。

现在,就您而言,有些浏览器会显示非 ASCII 字符,但这取决于浏览器的实现(在幕后,它仍在执行编码)。但是,GetRouteUrl 每次都会返回 ASCII 编码的形式,因为这是 URL 的要求。

(顺便说一句,那个“大约 8 年前的文档”定义了 URL。它是由Tim Berners Lee编写的。他对 Internet 产生了一些影响。)

更新

因为你让我感兴趣,所以我做了更多的研究。看起来国际化域名确实存在。但是,根据我从文章中了解到的情况,在幕后,ToASCII 或 ToUnicode 应用于名称。更多内容可以在本规范中阅读:RFC 3490。所以,再一次,你仍然在同一点上。更多讨论可以在这个Stackoverflow 问题中找到。

于 2013-06-06T21:33:47.953 回答
0

好的,各位,谢谢大家的回复,很有帮助。简单的答案是:Page.GetRouteUrl() 函数不可能做到这一点。很奇怪,为什么它没有像我们在 Request.Params 或 .QueryString 中那样依赖开发人员的编码/解码参数来开发,或者至少它是开发人员可以控制的一些替代路由功能。

我发现的一种方法是从 RouteTable 获取 Url 并手动解析它,在我的情况下它会像:

string url = (System.Web.Routing.RouteTable.Routes["RouteSearchSimple"] as System.Web.Routing.Route).Url.Replace("{SearchText}", "текст");

或者最简单的方法是通过字符串连接创建 url:

string param = "текст";
string url = "/search/" + param;

我已经做了什么,但在这种情况下,如果您更改路由 url,您将需要在所有出现的地方更改代码,因此最好在一个地方创建一些静态函数,如 GetSearchUrl(string searchText)。

它就像一个魅力,Url 看起来是人类可读的,我可以通过 RouteData.Values 读取参数

于 2013-06-07T06:01:25.200 回答
0

The most simple solution is to decode with UrlDecode method:

  string searchText = "текст";
  string url = Page.GetRouteUrl("RouteSearchSimple",
            new
            {
                SearchText = searchText
            });
  string decodedUrl = Server.UrlDecode(url); // => /search/текст
于 2013-10-14T07:34:29.383 回答