使用javascript参数将特殊字符传递给MVC 5控制器

时间:2015-02-20 11:00:26

标签: javascript c# asp.net-mvc

我试图允许用户编辑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;

一切正常,直到名称包含'/'或名称以'。'结尾。然后我得到一个“资源无法找到”。从服务器。 这很有道理,因为'/'和'。'人物正确地混淆了路由......

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

1 个答案:

答案 0 :(得分:2)

您需要对数据进行编码,以便正确传递/等字符。为此,您应该使用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值,并为其提供一个catch-all修饰符:

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

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