¿Cómo rellenar la variable javascript con JSON desde ViewBag?
asp.net asp.net-mvc (3)
Tengo este índice de acción:
public ActionResult Index()
{
var repo = (YammerClient) TempData["Repo"];
var msgCol = repo.GetMessages();
ViewBag.User = repo.GetUserInfo();
return View(msgCol.messages);
}
GetMessages devuelve una lista de mensajes POCO y GetUserInfo devuelve un POCO con la información del usuario (id, nombre, etc.).
Quiero llenar una variable de javascript con la representación JSON de la información del usuario.
Así que me gustaría hacer algo como esto en la vista:
...
<script>
var userInfo = "@ViewBag.User.ToJson()"
</script>
...
Sé que eso no funciona, pero ¿hay una manera de hacerlo? Quiero evitar tener que hacer una solicitud ajax una vez que la página se haya cargado solo para obtener la información del usuario.
Código del lado del cliente:
Esta es una llamada ajax a un controlador .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);
}
});
Código del lado del servidor:
CONTROLADOR:
public JsonResult GetStuff()
{
return Json(_manager.GetStuff(), JsonRequestBehavior.AllowGet);
}
GERENTE:
public IEnumerable<StuffViewModel> GetStuff()
{
return _unitofWork.GetStuff();
}
UNIDAD DE TRABAJO:
public IEnumerable<StuffViewModel> GetStuff()
{
var ds = context.Database.SqlQuery<StuffViewModel>("[dbo].[GetStuff]");
return ds;
}
La Unidad de Trabajo puede ser una consulta a un sproc (como lo he hecho), un contexto de repositorio, linq, etc. Estoy llamando a un sproc aquí por simplicidad, aunque podría argumentarse que la simplicidad está en Entity Framework y Linq .
En Vista puedes hacer algo como esto.
@{
var jss = new System.Web.Script.Serialization.JavaScriptSerializer();
var userInfoJson = jss.Serialize(ViewBag.User);
}
en javascript puedes usarlo como
<script>
//use Json.parse to convert string to Json
var userInfo = JSON.parse(''@Html.Raw(userInfoJson)'');
</script>
Estaba usando esta solución para objetos simples. Pero tuve algunos problemas para obtener una matriz de objetos js, así que solo dejaré lo que hice aquí.
DO#
@{
using Newtonsoft.Json;
ViewBag.AvailableToday = JsonConvert.SerializeObject(list);
}
js
var availableToday = JSON.parse(''@Html.Raw(ViewBag.AvailableToday)'');