【问题标题】:Passing in a querystring with a space?传入带有空格的查询字符串?
【发布时间】:2013-07-04 15:48:23
【问题描述】:

我有这样的动作:

public ActionResult UserDetails(string id)
{
}

context.MapRoute(
            "Admin_Default",
            "{controller}/{action}/{id}",
            new { action = "Index", controller = "Start", id = UrlParameter.Optional }
        );

在另一个视图中,我有一个来自 .net 标准会员管理的用户列表 想法是您单击用户名以显示详细信息,并且仅当用户名在一个单词中时才有效。我最近遇到了一个类似这样的用户名:

史蒂文 C.H.安德森

所以我用它来生成链接:

@Html.ActionLink(Model.UserName, "UserDetails", new { controller = "Security", id = HttpUtility.UrlEncode(Model.UserName) })

但是当我点击它时,我得到:HTTP Error 404.11 - Not Found

如果我点击一个单词的普通用户名,它就像一个魅力。

我假设路由配置不理解这个请求,问题是如何让它工作?

更新

链接:

<a href="/Security/UserDetails/Steven%2bC.H.%2bAndersson">Steven C.H. Andersson</a>

【问题讨论】:

  • 您能否发布呈现链接的 HTML 以防万一它不是我们所期望的?
  • 只是想一想:您是否尝试过自己对用户名进行编码,即仅使用..., id = Model.UserName })? MVC 在处理此类事情时通常非常聪明,使用自己的标准编码/解码。
  • 是的,在没有编码的情况下也进行了测试。结果相同。
  • 您的编码错误。它应该是 .../UserDetails/Steven%20bC.H.%20Andersson.../UserDetails/Steven+bC.H.+Andersson
  • 如果你要删除空格并链接到StevenC.H.Andersson,它会做什么?我知道这不是一个有效的用户名,但我很好奇您是否会收到 401.11 或其他错误。

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-routing


【解决方案1】:

编码显然是错误的,因为它将空格编码为“%2b”,即“+”。您传递的不是查询字符串参数,而是路径的一部分,因此您需要使用 HttpUtility.UrlPathEncode()

【讨论】:

  • 我对其进行了测试,但结果如下:从客户端 (%) 检测到潜在危险的 Request.Path 值。我还添加了 [ValidateInput(false)] 但我一直得到同样的结果。
  • 那么可能是不可能的。无论如何,将用户名作为标识符传递是个坏主意,因为它可能不是唯一的。
【解决方案2】:

我遇到了同样的问题,这是我解决的方法,但我不确定这是不是最好的方法。我渴望听到更优雅的解决方案。

在视图文件中:

@Html.ActionLink(Model.UserName, "UserDetails", new { controller = "Security", id = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(Model.UserName)) })

在控制器文件中:

id = Encoding.UTF8.GetString(Convert.FromBase64String(id))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2014-05-21
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多