我试图允许用户编辑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;
一切正常,直到名称包含'/'或名称以'。'结尾。然后我得到一个“资源无法找到”。从服务器。 这很有道理,因为'/'和'。'人物正确地混淆了路由......
但是我应该怎么做?我想允许'/'和'。'在名字中。
答案 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
的整个值。