web-dev-qa-db-fra.com

Comment remplir la variable javascript avec JSON depuis ViewBag?

J'ai cette action Index:

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

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

GetMessages renvoie une liste de messages POCO et GetUserInfo renvoie un POCO avec les informations de l'utilisateur (id, nom, etc.).

Je veux remplir une variable javascript avec la représentation JSON des informations utilisateur.

Je voudrais donc faire quelque chose comme ça dans la vue:

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

Je sais que cela ne fonctionne pas, mais existe-t-il un moyen de le faire? Je veux éviter d'avoir à faire une demande ajax une fois la page chargée juste pour obtenir les informations utilisateur.

20
emzero

Dans View, vous pouvez faire quelque chose comme ça

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

en javascript, vous pouvez l'utiliser comme

<script>


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

J'utilisais cette solution pour des objets simples. Mais j'ai eu quelques problèmes pour obtenir un tableau d'objets js, je vais donc laisser ce que j'ai fait ici.

C #

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

js

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

Code côté client:

Il s'agit d'un appel ajax vers un contrôleur .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);
    }
});

Code côté serveur:

MANETTE:

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

DIRECTEUR:

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

UNITÉ DE TRAVAIL:

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

L'unité de travail peut être une requête vers un sproc (comme je l'ai fait), un contexte de référentiel, linq, etc. .

2
eilenberger