2012-08-26 25 views
6

estoy produciendo una proyección a través de:Convertir IQueryable genérico para JSON

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

En mi página de afeitar que necesito utilizar:

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

tal que la matriz resultante se parece a:

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

He estado muy cerca de un par de enfoques diferentes - Puedo obtener una cadena que se ve correcta en el lado del servidor pero w Cuando se representa en la página, todas las marcas ' se convierten en '.

Pero centrarse en lograr esto a través de JSON.net ...

El enfoque más probable parece que debería ser:

var json = JsonConvert.ToString(query); 

pero que arroja:

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. 

Cuál es la corregir la sintaxis de JSON.net?

THX

Respuesta

10

Se necesita una combinación de .ToArray() y Html.Raw()

ToArray() para evaluar la consulta y hacer JsonConvert feliz

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

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

Nota: es necesario utilizar JsonConvert.SerializeObject si desea realizar una serie compleja tipos. JsonConvert.ToString se utiliza para convertir los tipos simples como bool, GUID, int, etc. uri

Y en su opinión Html.Raw que no codifican el html JSON:

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

Golpear un error de ejecución en la línea 'var JSON' . Tipo no admitido: <> f__AnonymousType2'2 [System.String, System.String] []. Realicé una conversión explícita de 'ToString()' para ambos elementos (ID es en realidad un número entero) pero no se modificó el error informado. mny thx – justSteve

+0

@justSteve gracias por los comentarios, tienes razón. He actualizado mi respuesta. – nemesv

+0

Eso lo hizo, muy apreciado. – justSteve