2010-11-03 22 views
5

Sto usando ASP.NET MVC e sto provando a generare un pezzo di javascript come parte del rendering della vista. Ho un modello che espone una serie di tipi semplici e vorrei generare un array javascript/json equivalente nella vista in modo che io possa agire su di esso usando jQuery. Quindi, dato il seguente modello:Genera array json raw in visualizzazione in ASP.NET MVC

public class Info { 
    public string Name {get;set;} 
    public int ID {get; set;} 
} 

public class InfoModel{ 
    public Info[] InfoList {get;set;} 
} 

... Vorrei generare un array JavaScript simile a questo:

var infoList = [ 
     { 
     Name = "...", 
     ID = 1 
     } , 
     { 
     Name = "...", 
     ID = 2 
     }, 
     .... 
     { 
     Name = "...", 
     ID = N 
     }]; 

Esiste un modo piacevole e conciso per fare questo nella vista, ho sembra che abbia problemi con la codifica delle virgolette se provo a far generare al modello una rappresentazione json, quindi attualmente posso solo averla generata usando un codice spaghetti/classico di asp che preferirei sostituire con una bella copertina.

EDIT: Si noti che non sto cercando di avere un controller per restituire un JsonResult, voglio un modo per la mia vista di contenere un array javascript che viene generato dal mio modello in una singola riga di codice (se possibile)

EDIT: Ho ottenuto parte del modo, ma sembra essere in difficoltà con la codifica. Questo codice nella visualizzazione:

<script> 
var list = <%: HtmlExtension.ToJson(Model.InfoList) %>; 
</script> 

(dove toJSON incapsula conversione in stringa tramite JavaScriptSerializer) uscite alcuni difetti di codifica:

var info = [{&quot;Name&quot;:&quot;Low End&quot;,&quot;ID&quot;:1}]; 

..che non è quello che cercavo. Ho potuto fare questo:

var info = <% Response.Write(HtmlExtension.ToJson(Model.InfoList)); %>; 

che funziona, ma non sembra come lucido. Devo ignorare esplicitamente la codifica come mostrato (l'output è sano, non generato dall'utente, quindi potrebbe non essere un problema) o mi manca qualcos'altro che lo rende meno classico di asp?

risposta

5

Sembra che tu abbia un problema di codifica. Credo che si hanno due scelte qui:

  1. Quando si crea il proprio interno, essere sicuri che restituisce MvcHtmlString al posto di un normale string, o ...
  2. Invece di usare lo stile <%: ... %> di scrivere il codice , utilizzare <%= ... %> per non eseguire la codifica.
+0

SÌ! grazie Jonathan, il MvcHtmlString era la magia che stavo aspettando ... –

+0

Sono stato in grado di utilizzare questa riga di codice nel mio file HTML del rasoio: MvcHtmlString.Create (Json.Encode (Modello)) – bkwdesign

+0

Esattamente. Alla fine è 'MvcHtmlString' è la chiave per farlo. –

1

Sì, c'è un bel modo:

InfoModel viewModel; // get this from wherever 
return Json(viewModel); 

MVC si tradurrà la collezione al JSON rilevanti.

Questo restituirà un JsonResult (ovvero JSON non elaborato).

E 'questo quello che cerchi?

Se si voleva fare qualcosa di simile nel tuo Vista:

<script type="text/javascript> 
    var json = <%: Model.JsonStuff %> 
    // more js 
</script> 

Poi sopra esempio non funzionerà.

È necessario serializzarlo manualmente quando si costruisce ViewModel.

EDIT

Ecco un esempio di come si possa serializzare i dati.

JavaScriptSerializer js = new JavaScriptSerializer(); 
var listOfInfos; // this will be a collection (e.g List) of Infos. 
var viewModel = new InfoModel 
       { 
        InfoList = js.Serialize(listOfInfos); 
       }; 
return View(viewModel); 

Fintanto di listOfInfo implementa IEnumerable, sarà serializzare in un array JSON.

È possibile che tu debba giocare un po 'con il tuo viewmodel, ma questo dovrebbe portarti sulla strada giusta.

+0

Sto cercando la seconda opzione, rendendo json nella vista, non avendo un'azione controller restituita json. Aggiornerò la domanda per chiarire –

+0

@soren enemaerke - guarda il mio aggiornamento. – RPM1984

+0

Grazie per il follow-up, ho provato il tuo approccio e non ha funzionato. Si prega di vedere la mia domanda aggiornata (ToJson incapsula la chiamata js.Serialize per tenerlo fuori dal modello viewmodel) –