2012-08-26 8 views
6

Je produis une projection via:Convertir IQueryable à JSON

var query = from book in books 
    select new 
    { 
     label = book.Title, 
     value = book.ID 
    }; 

Dans ma page de rasoir que je dois utiliser:

var booksArray = [{ 
     @(json) 
    }]; 

de telle sorte que le tableau résultant ressemble:

label: 'c++', 
value: 'c++' 
}, { 
label: 'java', 
value: 'java' 
}, { 
label: 'php', 
value: 'php' 
}, { 
label: 'coldfusion', 
value: 'coldfusion' 
} 

Je suis venu très près d'un couple d'approches différentes - je peux obtenir une chaîne qui semble correcte sur le côté serveur, mais w Lorsque la page est affichée, toutes les marques ' deviennent '.

Mais en se concentrant sur la réalisation de ce via JSON.net ...

L'approche la plus probable semble que ce devrait être:

var json = JsonConvert.ToString(query); 

mais lance:

Unsupported type: System.Linq.Enumerable+WhereSelectListIterator`2[Project.Entity.Book,<>f__AnonymousType3`2[System.String,System.Int32]]. Use the JsonSerializer class to get the object's JSON representation. 

Quelle est la corriger la syntaxe JSON.net?

thx

Répondre

10

Vous avez besoin d'une combinaison de .ToArray() et Html.Raw()

ToArray() pour évaluer la requête et faire JsonConvert heureux

var query = from book in books 
    select new 
    { 
     label = book.Title, 
     value = book.ID 
    }; 

var json = JsonConvert.SerializeObject(query.ToArray()); 

Remarque: vous devez utiliser JsonConvert.SerializeObject si vous voulez sérialiser complexe les types. JsonConvert.ToString est utilisé pour convertir des types simples comme bool, guid, int, uri etc.

Et selon vous Html.Raw de ne pas encode html du JSON:

var booksArray = @(Html.Raw(json)) 
+0

Frapper une erreur d'exécution sur la ligne 'var JSON' . Type non pris en charge: <> f__AnonymousType2'2 [System.String, System.String] []. J'ai fait une conversion 'ToString()' explicite pour les deux éléments (l'ID est en fait un entier) mais pas de changement à l'erreur signalée. mny thx – justSteve

+0

@justSteve merci pour les commentaires, vous avez raison. J'ai mis à jour ma réponse. – nemesv

+0

Cela l'a fait - très apprécié. – justSteve