Passing in a querystring with a space?

无人久伴 提交于 2019-12-24 08:16:53

问题


I have an action like this:

public ActionResult UserDetails(string id)
{
}

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

In another view i have a list with users from the standard membership management in .net Idea is that you click on a username to show the details and this works, only if the username is in one word. I recently encountered a username that looks like this:

Steven C.H. Andersson

So i use this to produce the link:

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

But when i click on it, i get: HTTP Error 404.11 - Not Found

If i click on a normal username that is one word, it works like a charm.

I assume that the route config is not understanding this request, question is how to get it to work?

Update

Link:

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

回答1:


The encoding is obviously wrong, as it encodes spaces as "%2b", which is "+". You're passing not a query string argument, but a part of path, so you need to use HttpUtility.UrlPathEncode()




回答2:


I had the same problem, here is how I solved it, but I am not sure it is the best way. I am keen to hear a more elegant solution.

In the view file:

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

In the controller file:

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


来源:https://stackoverflow.com/questions/17507548/passing-in-a-querystring-with-a-space

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!