如何在ASP中跳过编码参数.网路线

本文关键字:编码 参数 网路 ASP | 更新日期: 2023-09-27 18:17:21

. NET WebForm应用程序我有一个简单的规则:

路线。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

but I need ->/search/текст

怎么可能通过Page得到它?GetRouteUrl函数。

非常感谢!

如何在ASP中跳过编码参数.网路线

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

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

(顺便说一句,那份"大约8年前的文件")定义的url。作者是蒂姆·伯纳斯·李。他对互联网有一点影响。

因为你引起了我的兴趣,我做了更多的研究。看起来国际化域名确实存在。然而,从我从文章中了解到的,在表面之下,ToASCII或ToUnicode应用于名称。更多信息请参见RFC 3490规范。所以,你还是在同一个点。更多的讨论可以在这个Stackoverflow问题中找到

好的,伙计们,谢谢你们的回复,这很有帮助。简单的答案是:不可能通过Page.GetRouteUrl()函数做到这一点。这是非常奇怪的,为什么它没有开发的方式依赖于编码/解码参数的开发人员,就像我们在请求。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(字符串searchText)在一个地方。

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

最简单的解决方法是用UrlDecode方法解码:

  string searchText = "текст";
  string url = Page.GetRouteUrl("RouteSearchSimple",
            new
            {
                SearchText = searchText
            });
  string decodedUrl = Server.UrlDecode(url); // => /search/текст