Как заполнить переменную 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.