如何使用ViewBag中的JSON填充javascript变量?

emz*_*ero 21 javascript asp.net asp.net-mvc json viewbag

我有这个索引动作:

public ActionResult Index()
{  
    var repo = (YammerClient) TempData["Repo"];
    var msgCol = repo.GetMessages(); 

    ViewBag.User = repo.GetUserInfo();
    return View(msgCol.messages);
}
Run Code Online (Sandbox Code Playgroud)

GetMessages返回POCO消息列表,GetUserInfo返回一个POCO,其中包含用户信息(id,name等).

我想用用户信息的JSON表示填充javascript变量.

所以我想在视图中做这样的事情:

...
<script>
    var userInfo = "@ViewBag.User.ToJson()"
</script>
...
Run Code Online (Sandbox Code Playgroud)

我知道这不起作用,但有办法吗?我想避免在加载页面后只是为了获取用户信息而执行ajax请求.

san*_*eev 45

在View中你可以做这样的事情

@{
        var jss = new System.Web.Script.Serialization.JavaScriptSerializer();
        var userInfoJson = jss.Serialize(ViewBag.User);
}
Run Code Online (Sandbox Code Playgroud)

在javascript中你可以使用它

<script>


    //use Json.parse to convert string to Json
    var userInfo = JSON.parse('@Html.Raw(userInfoJson)');
</script>
Run Code Online (Sandbox Code Playgroud)

  • 你可以跳过服务器端序列化,只使用`var userInfo = JSON.parse('@ Html.Raw(Json.Encode(ViewBag.User))');` (6认同)
  • 我认为你不需要将json解析为字符串.只输出`var userInfo = @ Html.Raw(userInfoJson)` (2认同)

Knu*_*urO 6

将此解决方案用于简单对象.但是我在将数组转换为js对象时遇到了一些问题,所以我将离开我在这里做的事情.

C#

@{
  using Newtonsoft.Json;
  ViewBag.AvailableToday = JsonConvert.SerializeObject(list);
}
Run Code Online (Sandbox Code Playgroud)

JS

var availableToday = JSON.parse('@Html.Raw(ViewBag.AvailableToday)');
Run Code Online (Sandbox Code Playgroud)