Domanda

Perché devo specificare runat = " server " su tutti i miei controlli ASP.NET quando è un attributo obbligatorio e server è l'unica opzione disponibile in la mia conoscenza limitata di ASP.NET e ottengo un errore se non lo utilizzo?

Capisco che posso opzionalmente usarlo sui miei tag HTML, e capisco il paradigma client / server e cosa sta effettivamente specificando.

È un tag ridondante che potrebbe essere sottinteso dal fatto che il controllo è un controllo ASP.NET o c'è un motivo sottostante?

È stato utile?

Soluzione

Ho sempre creduto che ci fosse di più per capire che puoi mescolare tag ASP.NET e tag HTML, e i tag HTML hanno l'opzione di essere runat = " server " o non. Non fa male a nulla lasciare il tag e causa un errore del compilatore per eliminarlo. Maggiore è il significato del linguaggio Web, meno è facile per un programmatore in erba entrare e apprenderlo. Questo è un buon motivo per essere prolisso sugli attributi dei tag.

Questa conversazione si è svolta sul Blog di Mike Schinkel tra sé e Talbot Crowell di Microsoft National Services. Le informazioni pertinenti sono di seguito (primo paragrafo parafrasato a causa di errori grammaticali nella fonte):

  

[...] ma l'importanza di < runat = " server " > è più per coerenza ed estensibilità.

     

Se lo sviluppatore deve contrassegnare alcuni tag (vale a dire < asp: / > ) affinché il motore ASP.NET ignori, allora c'è anche il potenziale problema delle collisioni dello spazio dei nomi tra tag e miglioramenti futuri. Richiedendo l'attributo < runat = " server " > , questo viene negato.

Continua:

  

Se < runat = client > fosse richiesto per tutti i tag lato client, il parser avrebbe dovuto analizzare tutti i tag e rimuovere il < runat = client > parte.

Continua:

  

Al momento,   Se la mia ipotesi è corretta, il parser   ignora semplicemente tutto il testo (tag o no   tag) a meno che non sia un tag con il    runat = server o un " <% "   prefisso o ssi " <! - #include (...)   Inoltre, poiché ASP.NET è progettato per   consentire la separazione dei web designer   (foo.aspx) dagli sviluppatori web   (foo.aspx.vb), i web designer possono   utilizzare i propri strumenti di web designer per   inserire HTML e JavaScript lato client   senza dover conoscere ASP.NET   tag o attributi specifici.

Altri suggerimenti

Di solito non mi piace indovinare, ma ho intenzione di farlo su questo ...

Se ricordi l'hype di marketing .NET di Microsoft nel passato (2001?), era difficile dire cosa fosse .NET. Era un server? una piattaforma di programmazione? una lingua? qualcosa di completamente nuovo? Date le pubblicità, era ambiguamente qualsiasi cosa tu volessi che fosse - ha appena risolto qualsiasi problema che potresti avere.

Quindi, suppongo che ci fosse una visione nascosta che il codice ASP.NET potesse essere eseguito ovunque - lato server o lato client, in una copia di Internet Explorer legata al runtime .NET. runat = " Server " è solo un residuo di vestigia, lasciato alle spalle perché il suo equivalente lato client non è mai arrivato alla produzione.

Ricordi quelle strane pubblicità?

Correlati: Articolo da The Register con un po 'di storia .NET .

Non tutti i controlli che possono essere inclusi in una pagina devono essere eseguiti sul server. Ad esempio:

< INPUT type = " submit " runat = server / >

Questo è essenzialmente lo stesso di:

< asp: Button runat = server / >

Rimuovi il tag runat = server dal primo e hai un pulsante HTML standard che viene eseguito nel browser. Esistono ragioni a favore e contro l'esecuzione di un controllo specifico sul server e ASP.NET non ha modo di "assumere" quello che vuoi in base al markup HTML che includi. Potrebbe essere possibile "inferire" il runat = server per la famiglia di controlli < asp: XXX / > , ma suppongo che Microsoft considererebbe un hack per la sintassi di markup e il motore ASP.NET.

Articolo Microsoft Msdn I controlli dimenticati: controlli server HTML spiega l'uso di runat = " server " con un esempio sulla casella di testo < input type = " text " > convertendolo in < input type = " text " id = " Textbox1 " runat = " Server " >

  

In questo modo avrai accesso programmatico all'elemento HTML su   il server prima che la pagina Web venga creata e inviata al client.   L'elemento HTML deve contenere un attributo id. Questo attributo serve   come identità per l'elemento e consente di programmare gli elementi   dai loro ID specifici. Oltre a questo attributo, l'elemento HTML   deve contenere runat = " server " ;. Questo dice al server di elaborazione che il    il tag viene elaborato sul server e non deve essere considerato a   elemento HTML tradizionale.

In breve, per abilitare l'accesso programmatico all'elemento HTML aggiungere runat = " server " ad esso.

Il mio sospetto è che abbia a che fare con il modo in cui i controlli sul lato server vengono identificati durante l'elaborazione. Invece di dover controllare ogni controllo in fase di esecuzione per nome per determinare se è necessario eseguire l'elaborazione sul lato server, effettua una selezione sulla rappresentazione del nodo interno tramite tag. Il compilatore verifica che tutti i controlli che richiedono tag server li abbiano durante il passaggio di convalida.

Gli elementi HTML nei file ASP.NET sono, per impostazione predefinita, trattati come testo. Per rendere programmabili questi elementi, aggiungi un attributo runat = " server " all'elemento HTML. Questo attributo indica che l'elemento deve essere trattato come un controllo server.

È lì perché tutti i controlli in ASP .NET ereditano da System.Web.UI.Control che ha la "quotazione" " attributo.

nella classe System.Web.UI.HTMLControl, l'attributo non è richiesto, tuttavia nella classe System.Web.UI.WebControl l'attributo è richiesto.

modifica Fammi essere più specifico. poiché asp.net è praticamente un estratto di HTML, il compilatore ha bisogno di una sorta di direttiva in modo che sappia che tag specifici devono funzionare sul lato server. se quell'attributo non fosse presente, non è in grado di elaborarlo prima sul server. se non è presente, presuppone che sia un markup regolare e lo passa al client.

Penso che Microsoft possa correggere questa ambiguità facendo in modo che il compilatore aggiunga l'attributo runat prima che la pagina venga mai compilata, qualcosa come la cosa di cancellazione del tipo che ha Java con i generici, invece di cancellare, potrebbe scrivere runat = server ovunque veda asp: prefisso per i tag, quindi lo sviluppatore non dovrebbe preoccuparsene.

Se lo usi su normali tag html, significa che puoi manipolarli a livello di codice nei gestori di eventi ecc., ad es. cambiare l'href o la classe di un tag di ancoraggio al caricamento della pagina ... fallo solo se devi, perché i tag html alla vaniglia vanno più veloci.

Per quanto riguarda i controlli utente e i controlli server, no, semplicemente non funzioneranno senza di loro, senza aver scavato nelle viscere del preprocessore aspx, non saprei dire esattamente perché, ma indovinerebbero che probabilmente per buone ragioni, hanno appena scritto il parser in quel modo, cercando cose esplicitamente contrassegnate come "fare qualcosa".

Se @JonSkeet si trova ovunque, probabilmente sarà in grado di fornire una risposta molto migliore.

Quando si inviano i dati al server Web ASP.NET, i controlli indicati come Runat = "server" verranno rappresentati come oggetti Dot Net nell'applicazione server. È possibile digitare manualmente il codice nei controlli HTML oppure utilizzare l'opzione Esegui come server facendo clic con il pulsante destro del mouse in visualizzazione struttura. I controlli ASP.NET ottengono automaticamente questo attributo quando lo trascini dalla casella degli strumenti, in genere non i controlli HTML.

Attributo piuttosto ridondante, considerando l '" asp " tag è ovviamente un elemento ASP e dovrebbe essere sufficiente per identificarlo come elemento accessibile sul lato server.

Altrove, tuttavia, veniva utilizzato per elevare i normali tag da utilizzare nel code-behind.

Sono appena arrivato a questa conclusione per tentativi ed errori: runat = " Server " è necessario per accedere agli elementi in fase di esecuzione sul lato server. Rimuovili, ricompila e guarda cosa succede.

runat = " Server " indica che si verificherà un postback sul server per il controllo HTML ". "

I moduli Web utilizzano costantemente postback per segnalare al server di elaborare un evento di controllo della pagina.

Le pagine

.NET MVC NON usano postback (tranne che per un modulo " submit " ). MVC si basa su JQUERY per gestire la pagina sul lato client (evitando così la necessità di molti messaggi postback sul server).

Quindi: .NET Web Forms ... usa molto l'attributo " runat " nel markup della pagina.

.NET MVC non usa quasi mai l'attributo " runat " nel markup della pagina.

Spero che questo aiuti a chiarire perché runat è necessario ...

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