【问题标题】:Can't access to ViewBag (have a list of JSON objects ) from javascript无法从 javascript 访问 ViewBag(具有 JSON 对象列表)
【发布时间】:2015-08-05 23:57:36
【问题描述】:

在我的 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;

当我尝试通过此代码从 javascript 访问 ViewBag.Contacts 变量时

var contactData = '@ViewBag.Contacts';

调试后返回的值为字符串 [来自控制台]

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

【问题讨论】:

    标签: javascript c# json asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    您不能使用 JsonResult 返回 Json 格式的字符串。 JsonResult 类继承自 ActionResult 类,因此返回值是一个对象,其中包含 Json 格式的 'Data' 属性和一些其他用于响应的属性。所以并使用@符号输出结果,将类名作为字符串返回。 如果要将对象序列化为 Json 对象,请使用 Newtonsoft's Json.NET 序列化程序或使用 .NET 构建的 JavaScriptSerializer 类。

    牛顿软件:

    String serializedResult = JsonConvert.SerializeObject(jsonContactsGroups);
    

    JavaScriptSerializer:

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

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

    ViewBag.Contacts =  serializedResult;
    

    但是如果你想将 Json 模型或结果返回给视图,我建议你将 action 方法写成 JsonResult 方法。

    【讨论】:

    • 使用 NewtonSoft 对我有用,但我必须在 JsonConvert 前面加上 Newtonsoft.Json,就像在 Newtonsoft.Json.JsonConvert.SerializeObject() 中一样。
    【解决方案2】:

    使用 Html.RawJson.Encode 之类的

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 2012-05-10
        • 1970-01-01
        • 2020-11-28
        • 1970-01-01
        • 2017-11-03
        相关资源
        最近更新 更多