2014-03-26 14 views
16

Ich habe diesen Index Aktion:JavaScript Variable mit JSON von ViewBag füllen?

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

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

GetMessages gibt eine Liste von POCO-Nachrichten und GetUserInfo gibt eine POCO mit den Informationen des Benutzers (ID, Name, etc).

Ich mag einen JavaScript-Variable mit der JSON Darstellung der Benutzerinformationen füllen.

Deshalb möchte ich würde so etwas wie dies in der Ansicht tun:

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

Ich weiß, dass nicht funktioniert, aber ist es eine Möglichkeit, das zu tun? Ich möchte vermeiden, eine Ajax-Anfrage zu machen, sobald die Seite geladen ist, nur um die Benutzerinformationen zu erhalten.

+0

möglich Duplikat [ASP.NET MVC: Wie Ansicht Modell in Json Objekt konvertieren] (http://stackoverflow.com/questions/3365551/asp-net-mvc-how-to-convert-view-model- in-json-Objekt) – alexmac

Antwort

33

In View können Sie so etwas wie dieses

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

in Javascript tun Sie es als

<script> 


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

Ja, genau. Ich musste zu einer JSON.parse, weil es es als eine Zeichenkette erhielt: 'var userInfo = JSON.parse ('@ Html.Raw (userInfoJson)')' – emzero

+1

Ja, Recht. Ich werde meine Antwort aktualisieren, um anderen zu helfen. – sanjeev

+5

Sie können die serverseitige Serialisierung überspringen und einfach 'var userInfo = JSON.parse ('@ Html.Raw (Json.Encode (ViewBag.User))') verwenden;' –

4

wurde mit dieser Lösung für einfache Objekte verwenden können. Aber ich hatte ein paar Probleme damit, ein Array zu js Objekten zu bekommen, also werde ich einfach das hier lassen.

C#

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

js

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

Hey ich habe auf diese Weise verwendet, aber wenn ich Eigentum habe, das HTML oder ein anderes Json enthält, bekomme ich diesen Fehler" Unerwarteter Token t in JSON an der Position "ich versuche, es aufzulösen. –

2

clientseitigen Code:

Dies ist ein Ajax-Aufruf zu einem .Net MVC Controller:

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

Server- Seitlicher Code:

REGLER:

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

MANAGER:

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

UOW:

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

Arbeitseinheit eine Anfrage an einen sproc sein kann (wie ich getan habe), ein Repository Kontext, Linq, usw. ich der Einfachheit halber ein sproc hier bin nur nennen, obwohl es, dass die Einfachheit liegt könnte argumentiert werden, mit Entity Framework und Linq.

+0

Für mich ist dies die eleganteste Lösung. Nur eine Anmerkung, die Sie clientStuff = JSON.parse (Daten) möchten; um das Objekt und nicht die Textdarstellung zu speichern. – Rich