不能从javascript访问ViewBag(有一个JSON对象列表)

Can't access to ViewBag (have a list of JSON objects ) from javascript

本文关键字:JSON 对象 列表 有一个 javascript 访问 ViewBag 不能      更新时间:2023-09-26

在我的ASPMVC代码中我填充了ViewBag。使用下面的代码

设置Contacts变量
        var contactsGroups = EntityContext.DBContext.TS_GetConfirmedContacts(typeId,AccountId).GroupBy(c=>c.GroupName);
       // JSONGroup Custom object  
       List<JSONGroup> jsonContactsGroups = new List<JSONGroup>();
        foreach (var group in contactsGroups)
        {
            jsonContactsGroups.Add(new JSONGroup
            {
                GroupName = group.Key,
                Objects = new List<object>(group.ToList())
            });
        }

        var result = new JsonResult
        {
            Data = jsonContactsGroups,
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };
        ViewBag.Contacts =  result;

当我试图访问ViewBag。

var contactData = '@ViewBag.Contacts';

调试后返回字符串[from console]

var contactData = 'System.Web.Mvc.JsonResult';

不能使用JsonResult返回Json格式的字符串。JsonResult类继承自ActionResult类,因此返回值是一个包含Json格式的'Data'属性和一些其他响应属性的对象。因此,使用@符号输出结果,将返回类的名称作为字符串。如果你想将一个对象序列化为Json对象,请使用Newtonsoft的Json。.NET序列化器或使用.NET内置的JavaScriptSerializer类。

Newtonsoft:

String serializedResult = JsonConvert.SerializeObject(jsonContactsGroups);

JavaScriptSerializer:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer() ;
String serializedResult = serializer.Serialize(result);

然后将Json序列化字符串返回给视图:

ViewBag.Contacts =  serializedResult;

但是如果你想返回一个Json模型或结果到视图,我建议你写你的动作方法作为JsonResult方法。

使用Html。RawJson。编码

var model = @Html.Raw(Json.Encode(ViewBag.Contacts));
// fetch data
$.each(model.Data, function() {
    console.log($(this).attr("GroupName"));
});

使用JSON。Net(它可能已经被引用,因为MVC使用它作为默认序列化器)

using Newtonsoft.Json;
ViewBag.Contacts = JsonConvert.SerializeObject(jsonContactsGroups, Formatting.Indented);