Pregunta

Me gustaría empezar diciendo que mi código está funcionando perfectamente, esto es más una "mejor forma de hacerlo" tipo de pregunta.

Así que tengo un código como éste en mi archivo .aspx:

    function EditRelationship() {
        var projects=<%= GetProjectsForEditRelationship() %>;

        // fill in the projects list
        $('#erProjectsSelect').empty();
        for(var i in projects)
            $('#erProjectsSelect').append('<option value='+projects[i][0]+'>'+projects[i][1]+'</option>');

        var rels=<%= GetRelationshipsForEditRelationship() %>;

        // etc
    }

Una vez más fina, que está funcionando. El problema es que VS2008 ahoga un poco de código como este, se subraya el carácter < en las etiquetas (con advertencias asociadas), y luego negarse a facilitar la finalización de código para el resto del Javascript. También es negarse a formatear el documento más, dando errores de análisis . La última parte es mi peor molestia.

Me podría poner algunos de estos en evals supongo, pero parece sorta tonto para añadir capas adicionales y éxitos de rendimiento en tiempo de ejecución acaba de cerrar VS arriba, y no es siempre una opción (no puedo recordar la parte superior de mi la cabeza que esto no era una opción, pero confía en mí que tenía una construcción extraña).

Así que mi pregunta es, ¿Cómo se puede escribir esto mejor (donde mejor medio menor número de quejas VS)? Ni eval ni llamadas ajax se ajustan a esta imo.

¿Fue útil?

Solución

Si su objetivo es reducir las quejas de VS, y si está ejecutando asp.net 4 (soporte estático cliente IDS), tal vez una estrategia similar a la siguiente sería mejor?

  1. Crear un ASP: Control HiddenField, establezca su ClientIDMode a "estático"
  2. Asignar el valor de GetRelationshipsForEditRelationship () para este campo en carga de la página
  3. En el javascript, leer el valor del campo oculto en su lugar, supongo que sabe cómo hacer esto.

Es más trabajo que su solución, y se le añade algunos datos para la devolución de datos (si se realiza alguna), pero que no causa ninguna queja VS supongo:)

Otros consejos

Se podría hacer esto desde su página en el código subyacente

ClientScript.RegisterArrayDeclaration("projects", "1, 2, 3, 4");

o para construir algo así como JSON que podría escribirlo

ClientScript.RegisterClientScriptBlock(GetType(), "JSONDeclarations", "your json stuff");

Actualizar Basado en mi comentario

<script id="declaration" type="text/javascript">
    var projects=<%= GetProjectsForEditRelationship() %>;
    var rels=<%= GetRelationshipsForEditRelationship() %>;
</script>
<script type="text/javascript">
    function EditRelationship() {
        // fill in the projects list
        $('#erProjectsSelect').empty();
        for(var i in projects)
            $('#erProjectsSelect').append('<option value='+projects[i][0]+'>'+projects[i][1]+'</option>');
}
</script>

No tengo VS2008 instalado a prueba con, por lo que tomar esto con un grano de sal, pero ¿ha intentado algo como esto?

var projects = (<%= GetProjectsForEditRelationship() %>);

Algo así podría engañar al analizador JavaScript en ignorar el contenido de su expresión.

Por lo que vale, VS2010 correctamente análisis sintácticos y pone de relieve su fragmento de código original.

¿Es una opción para mover esto a VS2010? Acabo de copiar y pegar el código y el IDE interpreté correctamente.

La mejor solución es poner Javascript en un archivo separado y evitar esto por completo. Para esta función particular, que está haciendo el trabajo del lado del servidor. Por qué no construir la lista de opciones que tiene la intención de añadir dinámicamente en el código subyacente, ponerlos en un div oculto, y luego sólo tienen jQuery añadirlos a los ya prestados en HTML?

Si usted tiene una situación en la que realmente desea crear dinámicamente un montón JavaScript esta manera, considerar el uso de ScriptManager de código subyacente para establecer las variables que necesitará como scripts y registrarlos, entonces no se necesita la secuencia de comandos en línea para escapar

ScriptManager.RegisterClientScript("projects = " + GetProductsForEditRelationship());

(Básicamente, que no es la sintaxis completa, que es dependiente del contexto). A continuación, se refieren a "proyectos" en su función.

(editar)

Una forma poco más limpia de hacer esto en una escala más grande, creó todo lo que necesita como esto en código subyacente:

string script = "var servervars = {" +
  "GetProductsForEditRelationship: " + GetProductsForEditRelationship() + 
  "GetRelationshipsForEditRelationship: " + GetRelationshipsForEditRelationship() +
"}"

y se refieren a todo como:

servervars.GetProductsForEditRelationship

Si lo hace mucho, por supuesto, se puede crear una clase para automatizar la construcción de la secuencia de comandos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top