【问题标题】:Passing special characters to an MVC 5 controller with javascript parameters使用 javascript 参数将特殊字符传递给 MVC 5 控制器
【发布时间】:2015-02-20 11:00:25
【问题描述】:

我正在尝试允许用户在 MVC 应用程序中编辑名称。

控制器函数有这个签名:

[Route("function/edit/{id:int}/{name}/{sortorder:int}")]
public ActionResult Edit(int id, string name, int sortorder)
{...}

我在 Javascript 中这样调用它:

window.location.href = "@Url.Action("Edit", "Function")" + "/" + id + "/" + name + "/" + order;

一切正常,直到名称包含“/”或名称以“.”结尾然后我得到一个“找不到资源”。从服务器。 这是完全有道理的,因为'/'和'.'字符正确地混淆了路由......

但是我该怎么做呢?我想允许'/'和'。在名字中。

【问题讨论】:

  • 我已经尝试过 encodeURIComponent 和转义。他们都没有对“。”做任何事情。或'/'

标签: javascript c# asp.net-mvc


【解决方案1】:

您需要对数据进行编码,以便正确传递 / 等字符。为此,您应该使用encodeURIComponent 函数:

window.location.href = 
    "@Url.Action("Edit", "Function")" + "/" + id + "/" + 
        encodeURIComponent(name) + "/" + order;

比如这是编码前后的区别:

var test = "this.is/a test";
alert(test);
alert(encodeURIComponent(test));

除此之外,您的 MVC 应用程序还由于解码 URL 的方式而存在问题。对此的一种解决方案是重新排序路由中的参数以使 name 值最后并给它一个包罗万象的修饰符:

[Route("function/edit/{id:int}/{sortorder:int}/{*name}")]

这会强制 MVC 路由选择最后一部分作为 name 的整个值。

【讨论】:

  • encodeURIComponent(name) 对 '.' 没有任何作用或'/'
  • @JakobOlsen 是的,确实如此,请参阅链接,其中明确指出它对/ 进行了编码以及我通过示例所做的编辑。
  • 我的错...它实际上编码'/'。但这并不能解决问题。我仍然收到“找不到资源”。即使 / 被编码也会出错
  • @JakobOlsen 所以你确实需要编码,但我也对 MVC 特定问题进行了编辑。
  • 不错的建议,但它仍然不起作用。我认为问题可能是,url 在路由看到它之前就被解码了。如果我希望名称为“allan / bert”,那么 mvc 路由将看到 url “function/edit/1/2/allan / bert”,即使它在接收时是 url 编码的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多