Domanda

Mi piacerebbe iniziare dicendo che il mio codice è perfettamente funzionante, questo è più un "modo migliore per farlo" tipo di domanda.

Quindi devo codice come questo nel mio file .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
    }

Ancora una volta bene, sta funzionando. Il problema è che VS2008 soffoca un po in codice come questo, è sottolineando il carattere < nei tag (con avvisi associati), poi rifiutandosi di fornire il completamento del codice per il resto del javascript. E 'anche il rifiuto di formattare più il mio documento, dà errori parsing . L'ultima parte è il mio peggior fastidio.

ho potuto mettere un po 'di questi in evals credo, ma sembra sorta muto per aggiungere ulteriori strati e colpi di performance di runtime solo a chiudere VS su, e non è sempre un'opzione (non riesco a ricordare al largo della parte superiore della mia testa dove questo non era un'opzione, ma la fiducia di me avevo un costrutto strano).

Quindi la mia domanda è, come si fa meglio scrivere questo (in cui i mezzi migliori Minor numero di denunce VS)? Né eval nè chiamate ajax si adattano a questa IMO.

È stato utile?

Soluzione

Se il vostro scopo è quello di ridurre i reclami VS, e se si esegue asp.net 4 (supporto statico cliente Ids), forse una strategia simile alla seguente sarebbe meglio?

  1. Crea un ASP: controllo HiddenField, impostare il suo ClientIDMode di "Static"
  2. Assegna il valore di GetRelationshipsForEditRelationship () per questo settore al caricamento della pagina
  3. Nella tua javascript, leggere il valore dal campo nascosto invece, suppongo che voi sapete come fare questo.

E 'più lavoro di quanto la vostra soluzione, e si aggiungerà alcuni dati per il postback (se si esegue qualsiasi), ma non causerà alcun reclamo VS immagino:)

Altri suggerimenti

Si potrebbe fare questo dalla tua pagina nel code-behind

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

o per costruire qualcosa di simile JSON si potrebbe scrivere fuori

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

Aggiorna Sulla base della mia commento

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

Non avere VS2008 installato al test con, in modo da prendere questo con un grano di sale, ma hanno si è tentato qualcosa di simile?

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

Una cosa del genere potrebbe ingannare il parser JavaScript nel ignorando il contenuto della vostra espressione.

Per quel che vale, VS2010 correttamente analizza e mette in evidenza il vostro frammento di codice originale.

E 'la possibilità di spostare questo a VS2010? Io ho semplicemente copiato e incollato il codice e l'IDE interpretato in modo corretto.

La soluzione migliore è quella di mettere javascript in un file separato ed evitare questo del tutto. Per questa particolare funzione, si sta facendo il lavoro sul lato server. Perché non costruire l'elenco di opzioni che si intende aggiungere dinamicamente nel codebehind, metterli in un div nascosti, e poi basta avere jQuery aggiungerli dal già reso HTML?

Se si dispone di una situazione in cui davvero si vuole creare dinamicamente un sacco JavaScript in questo modo, è possibile utilizzare ScriptManager in codebehind per impostare le variabili di cui ha bisogno, come script e registrarle, poi lo script inline non sarà necessario sfuggire

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

(sostanza, che non è la sintassi completa, che è dipendente dal contesto). Poi fare riferimento a "progetti" nella funzione.

(edit)

Un modo po 'più pulito di fare questo su una scala più ampia, istituito tutto ciò che serve come questo in codebehind:

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

e si riferiscono a tutto come:

servervars.GetProductsForEditRelationship

Se si esegue questa operazione molto, naturalmente, è possibile creare una classe per automatizzare la costruzione dello script.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top