Как заполнить переменную javascript с помощью JSON из ViewBag?

У меня есть это действие индекса:

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, name и т.д.).

Я хочу заполнить переменную javascript представлением JSON информации о пользователе.

Поэтому я хотел бы сделать что-то вроде этого в представлении:

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

Я знаю, что это не работает, но есть ли способ сделать это? Я хочу избежать необходимости делать запрос ajax, как только страница загружается, чтобы получить информацию о пользователе.

Ответы

Ответ 1

В представлении вы можете сделать что-то вроде этого

@{
        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>

Ответ 2

Использул это решение для простых объектов. Но у меня возникли проблемы с получением массива в js-объектах, поэтому я просто оставлю то, что я здесь сделал.

С#

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

JS

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

Ответ 3

Клиентский код:

Это ajax-вызов контроллера .Net MVC:

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

UNIT OF WORK:

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

Единица работы может быть запросом к sproc (как я сделал), контексту репозитория, linq и т.д. Я просто называю sproc здесь для простоты, хотя можно утверждать, что простота заключается в Entity Framework и Linq.