【问题标题】:How to URL encode parameters in ASP .NET MVC如何在 ASP .NET MVC 中对参数进行 URL 编码
【发布时间】:2026-01-10 00:00:02
【问题描述】:

我认为有以下代码:

<%= Html.ActionLink(
           "View item", 
           "Index", 
            "Items", 
            new 
            { 
                itemName = Model.ItemName 
            }, 
            null) %>

当项目名称包含尖号 (#) 或百分号 (%) 时,我遇到了问题。

  • 当项目名称为"name#with#sharp#" 时,控制器仅接收名称的前半部分,直到第一个尖角(仅接收"name")。

  • 当项目名称为 "name%with%percent" 时,我收到错误:HTTP 错误 400 - 错误请求。

我不确定这是否是 URL 编码的问题,因为它适用于其他冲突字符,例如:

;
=
+
,
~
[blank]

你知道我该如何解决这个问题吗?

提前致谢。

【问题讨论】:

  • 生成了哪些网址?当我用“%”符号尝试上面的示例时,我得到了这个:http://localhost/AspNetMvc2/Items?itemName=name%25with%25percent,并且没有错误。此外,带有# 符号的示例会生成:http://localhost:55386/Items?itemName=name%23with%23sharp%23

标签: asp.net-mvc asp.net-mvc-2 urlencode


【解决方案1】:

我假设你有一个路由设置并且你的 url 看起来像这样:

http://localhost/Items/Index/name%25with%25percent - (这会爆炸)

与此相反:

http://localhost/Items/Index/?itemName=name%25with%25percent - (查询字符串没问题)

因此,一个选项是从您的路线(在您的 RouteCollection 中)中删除“itemName”属性,以便 Html.ActionLink 将使用 itemName 作为 QueryString 参数呈现 Url。

正如@Priyank 所说,问题在于 itemName 是 Url 的一部分(不是 QueryString 参数)并且包含非法字符。

【讨论】:

  • 是的,你猜对了。所以唯一使用 % 符号的地方是查询字符串。还有其他方法可以在 URL 中使用 % 吗?
【解决方案2】:

由于这些路由值是作为 URL 字符串的一部分发布的,因此它们将被视为单独的值,以 # 和 % 分隔。有几个选项可以处理您的案件。

您必须实现您的自定义 ValueProvider (IValueProvider and especially RouteDataValueProvider) 来处理您的自定义需求。一位程序员遇到了字符“/”的问题,他在这里破解了它http://mrpmorris.blogspot.com/2012/08/asp-mvc-encoding-route-values.html

其次是将值存储在 TempData 中,该值在两个请求中持续存在并使用它们。

希望这有助于朝着正确的方向思考。

【讨论】:

    【解决方案3】:

    您应该能够只使用视图的 UrlHelper 实例来为您执行此操作。试一试:

    <%= Html.ActionLink( "View item", "Index", "Items", new { itemName = Url.Encode(Model.ItemName) }, null) %>

    更新

    经过测试,似乎像我上面所做的那样显式编码似乎不太准确,并且会导致服务器进行双重编码(例如 - % 将在 url 中显示为 %2525)。

    【讨论】:

    • 这还不够。 IIS 正在将 name+hello 转换为 name%25%2bhello,但由于请求错误而失败
    • 无论我是否编码,对我来说都很好。全线200个状态码。实际上,当我 编码时,它似乎最准确,只是让路由和 IIS 正常工作。刚刚在 Casini 和 IIS Express 中使用您的 url 进行了测试,其中包含尖锐 (#)、百分比 (%) 和加号 (+) 示例。您使用的是什么版本的 IIS?
    • 要重现问题,您必须使用名为 itemName 的令牌设置路由 - 因此 url 看起来像:localhost/Items/Index/name%25with%25percent - 此 url 包含非法字符
    • @LeeGunn 感谢您的提示。在我的测试中,带有尖锐 (#) 的 url 似乎在定义路由标记的情况下仍然可以正常工作。百分比 (%) 触发 asp.net 请求验证,加号 (+) 返回 404。我尝试了@Priyank 建议的修复,这似乎有效。看来他已经找到答案了。如果我有代表,我会支持他。 :)