Question

Je voudrais commencer par dire que mon code fonctionne parfaitement, il s'agit plutôt d'une question du genre "comment le faire au mieux".

J'ai donc un code comme celui-ci dans mon .aspx déposer:

    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
    }

Encore une fois, ça marche bien.Le problème est que VS2008 s'étouffe un peu avec du code comme celui-ci, il souligne le < caractère dans les balises (avec les avertissements associés), puis en refusant de fournir la complétion du code pour le reste du javascript. Il refuse également de formater mon document, ce qui génère des erreurs d'analyse..La dernière partie est mon pire ennui.

Je pourrais en mettre quelques-uns evals Je suppose, mais cela semble un peu stupide d'ajouter des couches supplémentaires et des performances d'exécution juste pour faire taire VS, et ce n'est pas toujours une option (je ne me souviens pas de mémoire où ce n'était pas une option mais faites confiance moi j'avais une construction bizarre).

Donc ma question est, comment peux-tu écrire ceci au mieux (où le meilleur signifie le moins de plaintes VS) ?Ni l'un ni l'autre eval ni les appels ajax ne correspondent à cela, à mon avis.

Était-ce utile?

La solution

Si votre objectif est de réduire les plaintes VS, et si vous utilisez asp.net 4 (soutien client statique Ids), peut-être une stratégie comme celle-ci serait mieux?

  1. Créer un ASP: contrôle HiddenField, définissez son ClientIDMode à "statique"
  2. Attribuer la valeur de GetRelationshipsForEditRelationship () à ce champ de la charge de la page
  3. Dans votre javascript, lisez la valeur du champ au lieu caché, je suppose que vous savez comment faire cela.

Il est plus de travail que votre solution, et vous allez ajouter des données au postback (si vous effectuez une) mais il ne provoquera pas de plaintes VS je suppose:)

Autres conseils

Vous pouvez le faire à partir de votre page dans le code-behind

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

ou de construire quelque chose comme JSON, vous pouvez l'écrire

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

UPDATE Sur la base de mon commentaire

<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>

Je n'ai VS2008 installé à tester avec, afin de prendre cela avec un grain de sel, mais avez-vous essayé quelque chose comme ça?

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

Quelque chose comme ça pourrait tromper l'analyseur JavaScript en ignorant le contenu de votre expression.

Pour ce que ça vaut, VS2010 correctement Parsis et met en évidence l'extrait de code d'origine.

est-il une possibilité de déplacer ce à VS2010? Je viens de copier et collais votre code et l'IDE interprété correctement.

La meilleure solution est de mettre javascript dans un fichier séparé et d'éviter complètement cela.Pour cette fonction particulière, vous effectuez un travail côté serveur.Pourquoi ne pas créer la liste des options que vous avez l'intention d'ajouter dynamiquement dans le codebehind, les placer dans un div caché, puis demander à jQuery de les ajouter à partir du HTML déjà rendu ?

Si vous êtes dans une situation où vous souhaitez vraiment créer dynamiquement beaucoup de javascript de cette façon, envisagez d'utiliser ScriptManager dans codebehind pour configurer les variables dont vous aurez besoin en tant que scripts et les enregistrer, votre script en ligne n'aura alors pas besoin de s'échapper.

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

(Fondamentalement, ce n'est pas la syntaxe complète, qui dépend du contexte).Référez-vous ensuite aux « projets » dans votre fonction.

(modifier)

Une façon un peu plus simple de le faire à plus grande échelle, configurez tout ce dont vous avez besoin comme ceci dans codebehind :

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

et faites référence à tout comme :

servervars.GetProductsForEditRelationship

Si vous faites cela souvent, vous pouvez bien sûr créer une classe pour automatiser la construction du script.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top