【问题标题】:Why does urls get encoded in <link> tags within <head runat="server"> and how do I avoid it (asp.net)为什么 url 在 <head runat="server"> 中的 <link> 标记中编码以及如何避免它(asp.net)
【发布时间】:2011-01-04 10:25:44
【问题描述】:

(我已经使用从 webdev 服务器运行的 vanilla asp.net 站点对此进行了测试,这也是一个问题):

我的 .master 文件中有以下标记

<!DOCTYPE html>
<html>
<head runat="server">
    <link href="/Styles/Site.css" rel="stylesheet" type="text/css" />
    <link rel="alternate" type="application/rss+xml" title="rss" href="/Pages/Static/Feed.aspx?type=rss&lang=en" />    
</head>

渲染出来的html是这样的:

<!DOCTYPE html>
<html>
<head>
    <link href="/Styles/Site.css" rel="stylesheet" type="text/css" />
    <link rel="alternate" type="application/rss+xml" title="asdsad" href="/Pages/Static/Feed.aspx?type=rss&amp;lang=en" />
</head>

(rss链接“&”已编码为“&”)

但是,如果我将标记更改为

<!DOCTYPE html>
<html>
<head>
    <link href="/Styles/Site.css" rel="stylesheet" type="text/css" />
    <link rel="alternate" type="application/rss+xml" title="rss" href="/Pages/Static/Feed.aspx?type=rss&lang=en" />    
</head>

(head 标签上没有 runat="server") 然后生成的 html 会按预期出现:

<!DOCTYPE html>
<html>
<head runat="server">
    <link href="/Styles/Site.css" rel="stylesheet" type="text/css" />
    <link rel="alternate" type="application/rss+xml" title="rss" href="/Pages/Static/Feed.aspx?type=rss&lang=en" />    
</head>

显然,Asp.Net 对 url 进行了编码。碰巧的是,我确实需要将 head 标签设置为 runat="server",并且我还希望能够在其中的链接 URL 中包含“&”,我可以使用一些技巧来吃蛋糕并吃掉它也是?

你的 安德烈亚斯

【问题讨论】:

    标签: asp.net html urlencode head runatserver


    【解决方案1】:
    <head runat="server">
        <asp:Literal runat="server" ID='litLinks' />
    </head>
    

    C#代码:

    protected void Page_Load(object sender, EventArgs e)
    {
      litLinks.Text = "<link rel='alternate' type='application/rss+xml' title='rss' href='/Pages/Static/Feed.aspx?type=rss&lang=en' />"
                      + "<link href='/Styles/Site.css' rel='stylesheet' type='text/css' />";
    }
    

    【讨论】:

      【解决方案2】:

      注意:如果您要投反对票,请解释原因,因为我所说的没有任何错误,除非您另有证明。

      您应该在 url 中转义 & 符号,因为在 url 中放置了非转义 & 符号,浏览器期望有一些编码的东西。通过转义它,您可以告诉浏览器它是什么,一个&符号。

      它不会破坏您的链接并且是有效的。

      此外,如果您想在未定义新查询字符串参数的 url 中传递一个实际的 & 符号,那么您将 url 将 & 符号编码为 '%26'

      编辑:因为您可能以某种非常奇怪的方式使用它。这就是为什么,它是正确 ASP.Net 到 HTML 编码 HTML 文档的 & 符号。

      当浏览器发出对 URL 的请求时,它不会发送对 HTML 编码 URL 的请求,它会发送对非 HTML 编码 URL 的请求。

      如果由于某种原因您正在访问值服务器端或其他东西,那么您可以执行以下操作:

      var url = new Uri(HttpUtility.HtmlDecode(@"http://www.google.com/somepage.aspx?key1=value1&key2=value2"));
      var query = HttpUtility.ParseQueryString(url.Query);
      var result = query["key2"];
      Console.WriteLine(result);

      因此,您首先解码链接的 HTML 版本,将其解析为 Uri,从中获取查询字符串并键入您的键/值集合。

      【讨论】:

      • 如果我转义 url 那么我无法访问第二个参数,至少不能通过 asp.net HttpRequest 类,我必须手动编写一些解析逻辑来做到这一点。第二个参数突然被命名为“amp;lang”而不是我期待的“lang”
      • 不知道你为什么拒绝它,但如果你不能访问它,那么你做错了。
      • 在这里,为您搜索了它并选择了第一个与 & 符号和 URL 相关的链接。 htmlhelp.com/tools/validator/problems.html#amp
      • 没有任何事情,我使用的是标准的asp.net框架。如果框架在输出时对 url 进行编码,然后在输入时无法读取它们,那么它似乎是框架中的一个错误。 url 仅在 head 内编码,并且仅当 head 为 runat="server" 时,问题仍然存在:如何处理 within asp.net
      • 它已被编码,因为这是在 HTML 中格式化 URL 的正确方法。当浏览器发出对该资源的请求时,它不会发出带有 & 的请求,而是发出带有 & 的请求。因此,您在浏览器和服务器之间如何处理 URL 的规范之外所做的任何事情都是错误的。
      猜你喜欢
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      相关资源
      最近更新 更多