2009-07-28 15 views
33

He estado trabajando mucho con ASP.NET MVC y Javascript/jQuery últimamente y parece que voy en una dirección en la que siempre necesito pasar un valor dinámico "a" mi javascript. Cuando el script se encuentra en la página, lo que he hecho algo como esto:Mejores prácticas para pasar datos de asp.net-mvc a javascript

var isEditable = <%=ViewData["editable"]%> 

me gusta como esta es rápida y fácil & al igual que me inyecto un valor en el HTML. Pero esto huele. Realmente, realmente malo. Y rompe el intellisense y el formato de código de Visual Studio, lo que hace que mis guiones sean difíciles de leer y entender.

Se me ha ocurrido otra solución sería pasar mis datos a un campo oculto, y tienen la referencia de Javascript que ...

<input type="hidden" id="editable" value="<%=ViewData["editable"]%>" /> 
var isEditable = $("#editable").attr("value"); 

Ésta es probablemente mucho mejor, ya que mantiene intacto el guión y me permitiría moverlo a un archivo .js externo. Pero algo sobre esta solución tampoco parece ideal. O solo soy yo?

¿Alguien puede recomendar soluciones & mejores prácticas para pasar datos a sus scripts? ¿Me dirijo por el camino equivocado si mis guiones terminan confiando en los datos de vista de mis controladores en primer lugar?

+1

¿Qué tal "extraer" datos del modelo en algún tipo de almacén de datos en el controlador con AJAX? – Janie

+1

Creo que AJAX sería excesivo en el tipo de casos al que me refiero ... Mis scripts usualmente solo necesitan saber unos pocos bits de datos del controlador/modelo (datos que ya están presentes en la ejecución inicial de la página) de modo para emitir otra llamada de red un controlador parece demasiado. –

Respuesta

11

a veces pasar datos a mis páginas escribiendo un objeto de configuración de la página a través de un serializador JSON:

var pageConfig = <%= ServerConfig.ToJson() %>; 

donde tiene que escribir el método toJSON mismo. Esto mantiene el estado de la página muy bien contenido, por lo que solo hay un lugar donde puede inyectar los valores del servidor. Todo de aquí en adelante es javascript puro. En el ejemplo, se podría entonces hacer:

var isEditable = pageConfig.isEditable; 

incluso en un archivo externo de JS, si es pageConfig global. En ese caso, sin embargo, debe colocarlo correctamente: MY_APP.pageConfig quizás.

+0

¿Esto no afecta la chacheabilidad?Por lo menos, cada página GET puede devolver una página diferente (configuración diferente). Al pensar en términos de cachés en servidores proxy, ahora tendrá una versión diferente de esa página para cada usuario. ¿Es eso una preocupación? –

+0

Esta es una opción intrigante, pero no estoy seguro de entender exactamente cómo está implementando esta clase ServerConfig. De hecho, cada página GET puede devolver un conjunto diferente de datos, por lo que no sería necesario establecer pageConfig a partir de ViewData de cada página? De todos modos, tus otras sugerencias son algo que definitivamente intentaré/consideraré (Json y una variable global de js) - ¡gracias! –

+0

@Kurt - Sí, creo que tendrías que compilarlo a partir de ViewData (tal vez como un tipo anónimo). No quise decir que podría deshacerse de ViewData, pero podría limitar el número de lugares en los que está inyectando datos del servidor en la página. –

0

Vas a inyectar esa información de una forma u otra. Y OMI, su primer ejemplo no es realmente diferente del segundo.

Otra solución es tener una clase JS (¿o prototipo?) Que aceptará un objeto de opciones. Aunque admitidamente, no es realmente diferente de los ejemplos que has dado. Pero aún así, tal vez quieras ir por este camino.

$(function() { 
    myClass.init({ isEditable: <%=ViewData["editable"]%>, 
     another: '<%=ViewData["another"]%>' }); 
}); 
0

Creo que @ çağdaş hace un buen punto, pero recuerde revisar el lado del servidor también. Si configura un campo para "solo lectura", no hay nada que evite que el usuario modifique ese indicador, cambie un campo de solo lectura y lo envíe.

0

Todo el negocio de Ajax es carga información de forma asíncrona. Si estás haciendo el trabajo de Ajax (cargando la información y manteniéndola en una variable), eso le quita poder. ¿Por qué no pruebas JQuery y usas Ajax u Obtiene funciones para cargar el contenido dinámicamente? Ayudaría a que tu página cargue más rápido.

Cuestiones relacionadas