客户端上的JSON反序列化无法解析json字符串

时间:2013-02-14 05:48:22

标签: jquery asp.net-mvc-3 json.net

点击锚标签后,我的控制器的动作就会被击中。在查询字符串中传递了一个参数。我正在使用下面的代码将List转换为序列化的json sting。

public ActionResult EmployeeVote(string regionID)
 {
   var nomineeList = NomineeModel.GetNomineeByRegionID(Convert.ToInt16(regionID));
   ViewBag.NomineeList = JsonConvert.SerializeObject(nomineeList,Formatting.None);
   return View(ViewBag);
 }

这是json字符串我认为字符串的制作方式存在一些问题。

[{"Id":0,"EmpId":1,"FirstName":"First Last","Email":"mail@xyz.com","Description":null,"RegionID":0}]

在客户端。 但是模型列表在反序列化时会出错。

$(function () {
            var modelList = JSON.parse('@ViewBag.NomineeList');
           $(modelList).each((function () { //some logic});
 });

我想执行每个循环来迭代模型列表以创建一些动态元素。任何帮助?

2 个答案:

答案 0 :(得分:4)

问题是@ViewBag.NomineeList将对json字符串进行HTML编码。你需要阻止这种情况,但仍然要确保字符串是一个有效的javascript字符串。

在控制器中:

ViewBag.NomineeList = new JavaScriptSerializer().Serialize(
    JsonConvert.SerializeObject(nomineeList, Formatting.None)
    );

JavaScriptSerializer确保保存字符串以在JS中使用,因此新行被编码等。

然后,在视图中:

var modelList = JSON.parse(@Html.Raw(ViewBag.NomineeList));
  • 使用Html.Raw阻止HTML编码
  • 请勿将其括在引号中,因为这已由JavaScriptSerializer
  • 完成

更新:我添加了一个示例,说明如何在不使用JavaScriptSerializer的情况下使其工作。但我重新考虑了潜在的危险,并将其删除了。使用JavaScriptSerializer坚持上述方法,它更安全。

答案 1 :(得分:0)

这是一个临时解决方案:
替换“”“

ViewBag.NomineeList = JsonConvert.SerializeObject(nomineeList,Formatting.None).Remove(" "");

也可以尝试使用http://json.codeplex.com/