我的控制器中有以下代码:
public ActionResult MyPage()
{
var vm = new MyViewModel();
vm.StringList = "'" + String.Join("','", MyModel.GetList().Select(r => r.Name).ToArray()) + "'";
return View(vm);
}
在我的asp.net-mvc视图中,我有以下代码:
var myJavascriptArray = [<%=Model.StringList %>];
在javascript函数中
这个工作正常,直到:
中的一个名字 MyModel.GetList()
呼叫中有一个撇号,如“Bill O'Brien”
因为它会混淆我的javascript代码,因为它认为'在O之后是该条目的结尾和换行符。
逃离这个角色的最佳方式是什么,所以我可以在javascript中拥有一个数组,最终会显示为:
var myJavascriptArray = [''Item 1',Item 2','Item 3','Item 4'];
并处理'Bill O'Brien'作为参赛作品之一。
答案 0 :(得分:6)
您是否尝试使用所有这些手动撇号和内容进行某种JSON序列化?的不要即可。
只需定义一个包含名称列表的视图模型:
public class MyViewModel
{
public string[] Names { get; set; }
}
您将在控制器中填充并传递给视图:
public ActionResult MyPage()
{
var model = new MyViewModel
{
Names = MyModel.GetList().Select(r => r.Name).ToArray()
}
return View(model);
}
并在视图中JSON序列化此属性:
var myJavascriptArray = <%= new JavaScriptSerializer().Serialize(Model.Names) %>;
或者如果您使用的是ASP.NET MVC 3:
var myJavascriptArray = <%= Json.Encode(Model.Names) %>;
将在视图中生成正确的JSON编码字符串数组:
var myJavascriptArray = ["name 1", "name 2", "name 3"];
你可以像普通的js数组一样操作:
alert(myJavascriptArray[1]);
显然,这种技术适用于比简单的字符串数组更复杂的对象图。您可以安全地序列化整个对象模型,而无需担心单引号,双引号,括号等...当然除了所有这些之外,javascript序列化程序还将处理Bill O'Brien
之类的名称并对其进行正确编码。