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

问题描述 投票:21回答:4

我有此索引操作:

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

    ViewBag.User = repo.GetUserInfo();
    return View(msgCol.messages);
}

[GetMessages返回POCO消息的列表,而GetUserInfo返回POCO以及用户的信息(ID,名称等)。

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

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

...
<script>
    var userInfo = "@ViewBag.User.ToJson()"
</script>
...

我知道那行不通,但是有办法吗?我希望避免在页面加载后仅为了获取用户信息而进行ajax请求。

javascript asp.net asp.net-mvc json viewbag
4个回答
47
投票

在视图中,您可以执行类似的操作

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

在javascript中,您可以将其用作

<script>


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

8
投票

将这种解决方案用于简单对象。但是我在将数组传递给js对象时遇到了一些问题,因此我将在此留下我所做的一切。

C#

@{
  using Newtonsoft.Json;
  ViewBag.AvailableToday = JsonConvert.SerializeObject(list);
}

js

var availableToday = JSON.parse('@Html.Raw(ViewBag.AvailableToday)');

2
投票

客户端代码:

这是对.Net MVC控制器的ajax调用:

var clientStuff;

$.ajax({
    type: 'GET',
    url: '@Url.Action("GetStuff", "ControllerName")',
    data: {},
    dataType: "json",
    cache: false,
    async: false,
    success: function (data) {
        clientStuff = data;
    },
    error: function(errorMsg) {
        alert(errorMsg);
    }
});

服务器端代码:

CONTROLLER:

    public JsonResult GetStuff()
    {
        return Json(_manager.GetStuff(), JsonRequestBehavior.AllowGet);
    }

经理:

    public IEnumerable<StuffViewModel> GetStuff()
    {
        return _unitofWork.GetStuff();
    }

工作单位:

    public IEnumerable<StuffViewModel> GetStuff()
    {
        var ds = context.Database.SqlQuery<StuffViewModel>("[dbo].[GetStuff]");
        return ds;
    }

工作单元可以是对存储过程(如我所做的)的查询,存储库上下文,linq等。我在这里只是为了简单起见将一个sproc调用,尽管可以认为简单性在于Entity Framework和Linq。


0
投票

在ASP.Net Core中,您可以更改此行:

ViewBag.User = repo.GetUserInfo();

收件人

ViewBag.User = new HtmlString(repo.GetUserInfo());

如果无法访问HtmlString,则应添加使用Microsoft.AspNetCore.Html;

© www.soinside.com 2019 - 2024. All rights reserved.