3

单击锚标记时,我的控制器的动作被击中。有一个在查询字符串中传递的参数。我正在使用以下代码将列表转换为序列化的 json 字符串。

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});
 });

我想执行一个 each 循环来迭代模型列表以创建一些动态元素。有什么帮助吗??

4

2 回答 2

5

问题是@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,它更安全。

于 2013-02-14T10:58:43.303 回答
0

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

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

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

于 2013-02-14T10:50:08.133 回答