使用$ windows.location和ASP.NET MVC编码特殊字符的问题

时间:2017-04-21 10:41:35

标签: javascript c# asp.net-mvc url encoding

我有一个javascript代码,我在其中执行.net mvc操作的window.location。 id是一个数字e.x. 1234,而name是一个具有特殊字符的名称。 E.x. “勒厄德”

$window.location = "/mycontroller/myaction/?id=" + query.id + "&name=" + query.name;

在提琴手中,我可以看到请求网址变为: mydomain.com/controller/action/?id=1234&name=R%C3%B8ed

当我在ASP.NET MVC控制器中尝试从Request.QueryString获取查询字符串值时,我得到一些看似双重编码的字符串:

public ActionResult MyAction(LandingPage currentPage, string state)
{
    string queryString = Request.QueryString.ToString();
    var cultureName = CultureInfo.CurrentCulture.Name;

querystring成为:“id = 1234& name = R%u00f8ed”

如您所见,请求网址中的编码与asp.net中的编码不同。为什么呢?

我需要在我的应用程序(Røed)中进一步使用解码后的名称。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:0)

在javascript端尝试此操作(以确保正确编码每个部分):

$window.location = "/mycontroller/action/?id=" + encodeURIComponent(query.id) + "&name=" + encodeURIComponent(query.name);

这在MVC方面:

public ActionResult Action(string id, string name)
{

}

或者,现在使用您提供的示例:

public ActionResult MyAction(LandingPage currentPage, string state, string id = null, string name = null)
{
    if (id != null && name != null)
    {
    }
}

然后应该正确解释名称。因为您直接使用QueryString,所以它是编码的查询字符串。

如果你真的需要,你可以使用HttpUtility.ParseQueryString(...)来解析查询字符串,这会给你一个NameValueCollection,但这不是正确的做法。