我有一个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)中进一步使用解码后的名称。我怎么能做到这一点?
答案 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
,但这不是正确的做法。