Casa / Esercitazioni di Windows / Risposte forti html. Descrizione dell'oggetto Risposta. Indirizzi email

Risposte forti html. Descrizione dell'oggetto Risposta. Indirizzi email

L'oggetto descritto è uno strumento molto utile e potente. Questo oggetto ha diversi metodi, la loro descrizione è data di seguito:

Collezioni:

Metodi:

Proprietà:

Raccolta di Response.Cookies

La raccolta Cookies imposta i valori per i cookies. Se i cookie specificati non esistono, li crea. Se il cookie esiste, assume il nuovo valore e quello vecchio viene distrutto.

Response.Cookies(cookie) [(chiave) | . attributi] = valore

Opzioni:

  • biscotto- Nome del cookie
  • chiave- Parametro opzionale. Se è specificato, il cookie è una directory (nidificata) e la chiave è un insieme di valori.
  • attributi- Informazioni specifiche sui cookie stessi. Questo parametro può essere uno dei seguenti:
  • significato- Specifica il valore da assegnare alla chiave o all'attributo specificato.
NomeDescrizione
DominioRegistra solo. Se specificato, i cookie vengono inviati solo su richiesta da quel dominio.
ScadeRegistra solo. La data di scadenza del cookie. Questa data deve essere impostata affinché il cookie possa essere scritto sul cliente disco fisso dopo la fine della sessione. Se questo attributo non è impostato, la data di scadenza del cookie viene accettata data odierna. I cookie scadranno immediatamente al termine della sessione.
ha la chiaveSolo lettura. Indica se il cookie contiene la chiave data.
SentieroRegistra solo. Se specificato, il cookie viene passato solo su richiesta da quel percorso. Se il parametro non è impostato, viene utilizzato il percorso dell'applicazione.
sicuroRegistra solo. Indica se il cookie sarà protetto o meno.

Commento:

Se il cookie con la chiave viene creato come mostrato nel seguente script,

<% Response.Cookies("mycookie")("type1") = "сахар" Response.Cookies("mycookie")("type2") = "печенье" %>

quindi verrà inviata la seguente intestazione:

Set-Cookie:MYCOOKIE=TYPE1=zucchero&TYPE2=biscotti

Se si assegna un valore a mycookie senza utilizzare le chiavi, questa azione distruggerà le chiavi type1 e type2. Per esempio:<% Response.Cookies("myCookie") = "шоколадный зефир" %>

Nell'esempio precedente, le chiavi type1 e type2 verranno distrutte e i loro valori andranno persi. Mycookie ora conterrà il valore di marshmallow al cioccolato.

Puoi anche verificare l'esistenza di una chiave particolare nel modo seguente:

<% = Response.Cookies("myCookie").HasKeys %>

Se viene visualizzato TRUE, allora tale chiave esiste, nel caso di FALSE - no.

Metodo di risposta.Scrittura

Risposta.Scrivi variabile_o_valore

Opzioni:

  • variabile_o_valore- Dati da visualizzare sullo schermo del browser tramite HTML. Questo parametro può essere qualsiasi tipo supportato da VisualBasic Scripting Edition. Cioè, i dati possono essere di tipo: data, stringa, carattere, valori numerici. Significato dato parametro non può contenere %> combinazioni. Invece, puoi usare la combinazione equivalente %\>. Il server web tradurrà questa sequenza in quella richiesta quando lo script viene eseguito.

L'esempio seguente mostra come funziona il metodo Response.write per stampare un messaggio sul client.

Ti dico solo:<%Response.write "Привет всем!!!"%>E il tuo nome<%Response.write(Request.Form("name"))%>

L'esempio seguente aggiunge un tag HTML a una pagina Web. Poiché questo metodo non può contenere la combinazione %>, utilizziamo la sequenza %\>. Quindi uno script di esempio:

<% Response.write "

" %>

L'output sarà la riga:

Risposta.Metodo Reindirizzamento

URL Response.Redirect (URL - Descrittore risorse uniforme)

Opzioni:

  • URL- Il parametro è un descrittore di risorsa generico. Indica quando il browser deve essere reindirizzato.

Commento:

Qualsiasi occorrenza di questo metodo tra i tag e le pagine web verranno ignorate. Questo metodo può essere utilizzato solo nell'intestazione di una pagina HTML. Questo metodo passerà l'intestazione al browser se il parametro URL dell'oggetto viene omesso nella forma seguente:

HTTP/1.0 302 URL posizione spostata oggetto

Metodo Response.End

Fine risposta

Commento:

Se la proprietà Response.Buffer è stata impostata su TRUE, la chiamata al metodo Response.End svuoterà il buffer, inviando i dati al client. Se non si desidera visualizzare i dati all'utente, è necessario chiamare il metodo seguente:

<% Response.Clear Response.End %>

Metodo Response.AddHeader

Il metodo AddHeader aggiunge un'intestazione HTML con valori specifici. Questo metodo aggiunge sempre una nuova intestazione alla risposta al browser client. Questo metodo non sostituisce un'intestazione esistente con una nuova. Il titolo aggiunto non può essere rimosso.

Questo metodo viene utilizzato solo per attività "avanzate".

Response.AddHeader nome_variabile, valore

Opzioni:

  • nome_variabile- Il nome delle nuove opzioni di intestazione HTML.
  • significato- Il valore da impostare da ricordare nell'intestazione.

Appunti:

Affinché il metodo funzioni correttamente, nome_variabile non deve contenere il carattere di sottolineatura (_). Il set ServerVariables interpreta il carattere di sottolineatura come un trattino nell'intestazione. Ad esempio, lo script seguente forza il server a trovare un parametro da un'intestazione HTML denominata MY-HEADER.

<% Requset.ServerVariables("HTTP_MY_HEADER") %>

Poiché il protocollo HTTP richiede che tutti i parametri di intestazione vengano passati prima dell'inizio del corpo della pagina HTML, è necessario chiamare il metodo AddHeader nello script prima che inizi la descrizione. .... C'è un'eccezione. Se il valore della proprietà Buffer è impostato su true (true), puoi scrivere AddHeader in qualsiasi punto dello script, ma prima della prima chiamata al metodo Flush. In caso contrario, la chiamata al metodo AddHeader genererà un errore.

I successivi due file .asp illustrano l'ultimo punto.

<% Response.AddHeader "Внимание!", "Текст сообщения об ошибке"%> il tuo testo sulla pagina

A questo esempio la pagina non è memorizzata nel buffer. Lo script funziona, tuttavia viene chiamato AddHeader prima che il server produca output HTML per il client.

<% Response.Buffer = true %> ecco alcune informazioni della tua pagina...<%Response.AddHeader "Внимание!", "сообщение об ошибке"%> <%Response.Flush%> <%Response.Write("некий текст")%>

Nel secondo esempio, la pagina viene memorizzata nel buffer e, di conseguenza, il server non invia il testo al client fino al termine dello script stesso o fino a quando non viene rilevato il metodo Flush. È possibile utilizzare questo metodo per inviare più copie di alcuni parametri di intestazione con valori diversi, come con l'intestazione WWW-Authenticate.

Metodo Response.AppendToLog

Il metodo AppendToLog aggiunge una riga alla fine del file di registro del server Web. Puoi chiamare questo metodo tutte le volte che vuoi. Ogni volta che viene chiamato il metodo, la stringa specificata verrà scritta nel file di rapporto del server.

Valore Response.AppendToLog

Opzioni:

  • significato- Testo da aggiungere al file di rapporto del server web. Data linea non può contenere un carattere virgola (,). Inoltre, la lunghezza totale della riga aggiunta non deve superare gli 80 caratteri.

Appunti:

Per utilizzare questa funzione, è necessario che l'opzione Query URI sia abilitata nel pannello "Proprietà di registrazione avanzate" per questo server Web in IIS.

Metodo Response.BinaryWrite

Il metodo BinaryWrite consente di scrivere le informazioni specificate nell'output HTTP corrente senza alcuna conversione di caratteri. Questo metodo è utile per visualizzare informazioni non stringa, come i dati binari richiesti da un'applicazione.

Dati Response.BinaryWrite

Opzioni:

  • dati- Dati destinati all'output HTTP.

Se si dispone di un oggetto che produce una matrice di byte, è possibile utilizzare la seguente chiamata a questo metodo per passare tale matrice a un'applicazione in esecuzione sul computer client.

<% Set BinGen = Server.CreateObject(My.BinaryGenerator) Pict = BinGen.MakePicture Response.BinaryWrite Pict %>

Metodo Response.Clear

Il metodo Clear cancella tutto l'output HTML memorizzato nel buffer. Tuttavia, questo metodo non cancella le informazioni di intestazione dal buffer. È possibile utilizzare questo metodo per gestire gli errori. Tuttavia, questo metodo genererà un errore se la proprietà Response.Buffer non è true.

Proprietà Response.CacheControl

Questa proprietà sostituisce il valore predefinito. Quando si imposta la proprietà su Public, il server proxy può memorizzare nella cache l'output generato da ASP.

Response.CacheControl [= intestazione di controllo della cache]

Opzioni:

  • Intestazione di controllo della cache- Questa opzione di controllo del titolo può essere pubblica o privata.

Proprietà Response.CharSet

La proprietà CharSet consente di aggiungere il nome della tabella dei codici dei caratteri (ad esempio, WINDOWS-1251) all'intestazione HTML, la stringa del tipo di contenuto (tipo di contenuto).

Response.CharSet nome_tabella di codici

Opzioni:

  • nome_tabella codici- Una stringa che specifica la tabella dei codici per la pagina HTML specificata. Il nome di questa tabella di codici verrà aggiunto all'intestazione del file HTML sotto il parametro "content-type".

Per una pagina ASP che non utilizza la proprietà Response.Charset, il parametro "content-type" nell'intestazione sarà:

tipo di contenuto: testo/html

Se il file ASP contiene il comando

<%Response.Charset("Windows-1251")%>

quindi nell'intestazione apparirà il campo del tipo di contenuto

tipo di contenuto: testo/html; set di caratteri=Windows-1251

Commento:

Questa funzione inserisce qualsiasi stringa nell'intestazione e non verifica se è corretta.

Se la pagina contiene più tag Response.Charset, ogni tag successivo sostituirà il valore con il proprio.

Proprietà Response.ContentType

La proprietà ContentType consente di specificare il tipo (tipo) del contenuto del file HTML. Se una data proprietà non utilizzato, il valore predefinito è text/html.

Response.ContentType [=tipo_contenuto]

Opzioni:

  • Tipo di contenuto- Una stringa che descrive il tipo di contenuto HTML. Questa stringa ha solitamente la forma "tipo/sottotipo", dove tipo è la categoria di contenuto principale e sottotipo specifica il tipo di contenuto. Per ottenere elenco completo tipi supportati: fare riferimento alla documentazione del browser o alla specifica HHTP.

L'esempio seguente illustra l'impostazione del tipo di contenuto su Channel Definition Format (Push Channels).

<% Response.ContentType = "application/x-cdf" %>

Il secondo esempio illustra l'impostazione della proprietà sui valori più comunemente noti.

<% Response.ContentType = "text/HTML" %> <% Response.ContentType = "image/GIF" %> <% Response.ContentType = "image/JPEG" %>

Proprietà Response.Expires

La proprietà Expires specifica la quantità di tempo fino a Pagina HTML memorizzato nella cache dal browser è considerato non scaduto (periodo di conservazione). Se l'utente richiede una pagina memorizzata nella cache da un browser che non è scaduto, il browser la restituisce direttamente dalla sua cache.

Response.Expires [=numero]

Opzioni:

  • numero- La quantità di tempo in minuti prima che una pagina sia considerata "scaduta". L'impostazione di questo valore su 0 fa sì che la pagina data diventi "scaduta" immediatamente.

Commento:

Se questa proprietà viene impostata più di una volta in una pagina, viene utilizzato il valore più piccolo.

Response.ExpiresAbsolute proprietà

La proprietà ExpiresAbsolute specifica l'ora e la data dopo la quale una pagina HTML memorizzata nella cache dal browser viene considerata scaduta. Se l'utente richiede una pagina memorizzata nella cache da un browser che non è scaduto, il browser la restituisce direttamente dalla sua cache. Se viene specificata un'ora (e viene specificata una data), il "periodo di conservazione" della pagina scade alla mezzanotte di quel giorno. Se non viene specificata né l'ora né la data, il valore viene assegnato in base al giorno e all'ora in cui è stato eseguito lo script.

Response.ExpiresAbsolute [= [data] [ora]]

Opzioni:

  • l'appuntamento- Indica la data di scadenza del "periodo di conservazione". Il formato della data deve essere conforme allo standard RFC-1123.
  • volta- Indica l'ora di scadenza della pagina "periodo di conservazione". Valore dato viene convertito nel formato GMT (Greenwich Mean Time) prima che l'intestazione venga inviata al client.

Commento:

Se questa proprietà viene definita più di una volta per pagina, si presume che il tempo di scadenza del "periodo di conservazione" sia il più breve di tutti i valori specificati.

<% Response.ExpiresAbsolute = #May 31,1998 13:30:15# %>

Proprietà Response.IsClientConnected

Questa proprietà è un valore di sola lettura, il che significa che non è possibile assegnare valori a questa proprietà. Questa proprietà indica se il client è connesso o meno al server, come definito nell'ultimo di Response.Write.

Response.IsClientConnected()

Commento:

Questa proprietà consente di determinare quando l'utente è connesso e quando è disconnesso dal server. Ad esempio, l'intervallo di tempo tra la risposta del server e il momento in cui il client ha effettuato una richiesta garantisce che il client sia ancora connesso e ha senso continuare a eseguire lo script.

<% "посмотрим, подключен ли пользователь If Not Response.IsClientConnected Then "получаем номер сессии и закрываем сессию Shutdownid = Session.SessionID "подготовка к закрытию сессии Shutdown(Shutdownid) End If %>

Proprietà Response.Pics

Questa proprietà consente di aggiungere il valore del campo pics-label all'intestazione della risposta.

Response.PICS(PICSLabel)

Opzioni

  • Etichetta foto- Una stringa che è stata convertita in formato PICS - un'etichetta. Il valore specificato in questo parametro viene aggiunto all'intestazione della risposta nel campo PICS.

Per un file ASP che include:

<% Response.PICS("(PICS-1.1 etichette su " & chr(34) e "1997.01.05T08:15-0500" fino a "1999.12.31T23:59-0000" (v 0 s 010 n 0))%>

Verrà generata l'intestazione successiva

Etichetta-PICS:(PICS-1.1 etichette su "1997.01.05T08:15-0500" fino a "1999.12.31.T23:59-0000" (v 0 s 0 1 0 n 0))

Commento:

Questa proprietà consente di inserire qualsiasi riga nell'intestazione, indipendentemente dal fatto che le righe siano valide.

Se la pagina contiene molti tag contenenti Response.PICS, ognuno di quelli successivi sostituirà il valore del precedente.

Proprietà Response.Status

Questa proprietà consente di specificare la stringa di stato restituita dal server. I valori di stato sono definiti nella specifica HTTP.

Response.Status = descrizione_stato

Opzioni

  • descrizione_stato- Una stringa che contiene sia un numero di tre cifre che indica il codice di stato sia una breve descrizione di questo codice. Ad esempio, 310 Sposta in modo permanente.

L'esempio seguente mostra l'impostazione dello stato:

<% Response.Status = "401 Unauthorized" %>

Commento:

Utilizzare questa proprietà per modificare la stringa restituita dal server.

Traduzione: Vlad Merzhevich

Tutti conoscono i moduli web, giusto? Incolla il tag
, parecchi , può essere , completiamo il tutto con il pulsante e fatto.

Non ne sai la metà. HTML5 definisce oltre una dozzina di nuovi tipi di campo che puoi utilizzare nei tuoi moduli. E quando dico "usa", intendo dire che possono essere utilizzati in questo momento, senza pad, hack o soluzioni alternative. Non preoccuparti troppo, non sto dicendo che tutte queste nuove entusiasmanti funzionalità siano effettivamente supportate in ogni browser. Assolutamente no, non intendo da tutti. Nei browser moderni, sì, i tuoi moduli mostreranno tutto ciò che possono. Ma nei browser meno recenti, i moduli continueranno a funzionare, anche se non completamente. Cioè, queste funzionalità si degradano con grazia in ogni browser. Anche in IE6.

Testo guida

Supporto per i suggerimenti
CIOÈ Firefox safari Cromo musica lirica i phone Androide
- 4.0+ 4.0+ 4.0+ 11.0+ 4.0+ -

Il primo miglioramento HTML5 ai moduli è la possibilità di impostare il testo del prompt nel campo di input. Tale testo viene visualizzato nel campo di input se il campo è vuoto e non ha lo stato attivo. Non appena si fa clic nel campo di immissione (o si accede ad esso tramite Tab ), il testo del prompt scompare.

Probabilmente hai già visto il testo del suggerimento prima. Ad esempio, Mozilla Firefox include il testo del suggerimento nella barra degli indirizzi che dice "Cerca nei segnalibri e nella cronologia".

Quando si fa clic sulla barra degli indirizzi, il testo del prompt scompare.

Ecco come includere il testo del prompt nei moduli.


placeholder="(!LANG:Cerca nei segnalibri e nella cronologia" !}>

I browser che non supportano l'attributo segnaposto semplicemente lo ignorano. Nessun danno o danno.

Chiedi al Professor Markup

☞ D. Posso utilizzare il markup HTML per l'attributo segnaposto? Voglio inserire una foto o magari cambiare i colori.

R. L'attributo segnaposto può contenere solo testo, nessun codice HTML. Tuttavia, esistono estensioni CSS speciali che consentono di impostare lo stile del testo in alcuni browser.

Campi con autofocus

Supporto per la messa a fuoco automatica
CIOÈ Firefox safari Cromo musica lirica i phone Androide
- - 4.0+ 3.0+ 10.0+ - -

I siti possono utilizzare JavaScript per concentrarsi automaticamente sul primo campo del modulo. Ad esempio, nella pagina principale Google.com l'autofocus è nel campo per l'inserimento delle parole chiave di ricerca. Anche se questo è conveniente per la maggior parte delle persone, può essere fastidioso per utenti esperti e persone con bisogni speciali. Se si preme la barra spaziatrice mentre si attende che la pagina scorra, non ci sarà lo scorrimento perché il focus è sul campo di input del modulo (ci sarà uno spazio digitato nel campo invece di scorrere). Se sposti lo stato attivo su un altro campo di input durante il caricamento della pagina, lo script di messa a fuoco automatica del sito può "utile" riportare lo stato attivo sul campo di input originale, interrompendo la digitazione e causando la digitazione nel posto sbagliato.

Poiché l'autofocus funziona tramite JavaScript, possono esserci complessità per gestire questi estremi e poche opzioni per le persone che non vogliono che una pagina Web "rubi" la loro attenzione.

Per risolvere questi problemi, HTML5 introduce l'attributo autofocus su tutti gli elementi del modulo. L'attributo autofocus fa esattamente quello che sembra: non appena la pagina viene caricata, sposta lo stato attivo sul campo specificato. Ma poiché si tratta solo di markup e non di uno script, il comportamento sarà coerente in tutti i siti. Inoltre, i produttori di browser (o gli autori di estensioni) possono offrire agli utenti un modo per disattivare la messa a fuoco automatica.

Ecco come impostare un campo modulo di messa a fuoco automatica.




I browser che non supportano l'attributo autofocus lo ignoreranno.

Che cosa? Stai dicendo che vuoi che la messa a fuoco automatica funzioni ovunque, non solo nei fantasiosi browser HTML5? Puoi lasciare lo script corrente con l'autofocus, basta apportare due piccole modifiche:

  • aggiungi l'attributo autofocus al codice HTML;
  • controlla se il browser supporta l'attributo autofocus e, in caso contrario, esegui il tuo script.

Autofocus con un'alternativa





Metti a fuoco il prima possibile

Molte pagine Web attendono che window.onload si attivi e metta a fuoco. Ma l'evento window.onload non verrà attivato finché tutte le immagini non saranno state caricate. Se la tua pagina ha molte immagini, tali script ingenui cambieranno potenzialmente lo stato attivo dopo che l'utente avrà iniziato a interagire con un'altra parte della tua pagina. Questo è il motivo per cui gli utenti esperti odiano gli script di messa a fuoco automatica.

Ad esempio, nella sezione precedente, lo script di messa a fuoco automatica viene posizionato immediatamente dopo il campo del modulo a cui fa riferimento. Questa è la soluzione ottimale, ma potrebbe ferire i tuoi sentimenti mettere un blocco di codice JavaScript nel mezzo della pagina (o più banale, il tuo sistema potrebbe non essere così flessibile). Se non riesci a inserire uno script nel mezzo di una pagina, devi impostare lo stato attivo tramite un evento personalizzato come $(document).ready() in jQuery invece di window.onload .

Messa a fuoco automatica tramite jQuery









L'evento personalizzato jQuery si attiva non appena il DOM è disponibile, ovvero attende il caricamento del testo della pagina, ma non attende il caricamento di tutte le immagini. Questo non è un approccio ottimale: se la pagina è insolitamente grande o la connessione di rete è lenta, l'utente potrebbe comunque interagire con la pagina prima che lo script di attivazione venga eseguito. Ma è comunque molto meglio che attendere l'attivazione dell'evento window.onload.

Se sei d'accordo e sei disposto a inserire uno script con una singola istruzione nel codice della tua pagina, questo è un compromesso meno odioso della prima opzione e migliore della seconda. Puoi utilizzare gli eventi personalizzati jQuery per impostare i tuoi eventi, ad esempio autofocus_ready. Quindi puoi chiamare questo evento manualmente, subito dopo che il campo di messa a fuoco automatica è disponibile. Grazie a E. M. Shtenberg per avermi insegnato questa tecnica.

Autofocus con evento personalizzato alternativo










Questa soluzione è ottimale, come il primo approccio. Lo stato attivo verrà impostato sul campo del modulo non appena è tecnicamente possibile mentre il testo della pagina è ancora in caricamento. Parte della logica dell'applicazione (focus sul campo del modulo) è stata spostata dal corpo della pagina alla sezione . Questo esempio è basato su jQuery, ma il concetto di eventi personalizzati non è esclusivo di jQuery. Altre librerie JavaScript come YUI e Dojo offrono funzionalità simili.

Riassumiamo.

  • Ottenere la giusta messa a fuoco è importante.
  • Se possibile, chiedi al browser di utilizzare l'attributo di messa a fuoco automatica nel campo su cui desideri mettere a fuoco.
  • Se utilizzi il codice alternativo per i browser meno recenti, definisci il supporto per l'attributo autofocus in modo che lo script venga eseguito solo nei browser meno recenti.
  • Metti a fuoco il prima possibile. Incolla lo script del focus nel codice subito dopo il campo del modulo. Se ciò non ti disturba, incorpora una libreria JavaScript che supporti eventi personalizzati e attiva l'evento nel codice subito dopo il campo del modulo. Se ciò non è possibile, usa un evento come $(document).ready() da jQuery.
  • In nessun caso attendere che window.onload metta a fuoco.

Indirizzi email

Per più di dieci anni, i moduli hanno contenuto solo pochi tipi di campi. I più comuni sono i seguenti.

Tutti questi tipi di campo funzionano ancora in HTML5. Se "aggiorni a HTML5" (magari modificando !DOCTYPE ), non dovrai apportare una sola modifica ai tuoi moduli. Evviva la compatibilità con le versioni precedenti!

Tuttavia, HTML5 definisce 13 nuovi tipi di campo e non c'è motivo per non iniziare a usarli.

Il primo di questi nuovi tipi è l'indirizzo email. Somiglia a questo.





Stavo per scrivere una frase che iniziava "nei browser che non supportano type="email"..." ma si interrompeva. Come mai? Perché non sono sicuro se i browser non supportano type="email" . Tutti i browser "supportano" type="email" . Potrebbero non fare nulla di speciale, ma i browser che non riconoscono type="email" lo tratteranno come type="text" e lo renderanno come un normale campo di testo.

Sottolineerò quanto questo sia importante. Ci sono milioni di moduli su Internet che richiedono un indirizzo e-mail e tutti li usano . Vedi un campo di testo, inserisci il tuo indirizzo email in esso e il gioco è fatto. Ed ecco che arriva HTML5, che definisce type="email" . I browser stanno impazzendo? No. Ogni browser sulla terra tratta l'attributo di tipo sconosciuto come type="text" - anche IE6. Quindi puoi "aggiornare" i tuoi moduli con type="email" in questo momento.

Cosa succede se, ad esempio, il browser supporta type="email" ? Beh, potrebbe significare qualsiasi cosa. La specifica HTML5 non richiede alcuna interfaccia utente particolare per i nuovi tipi di campo. Opera riempie il campo del modulo con una piccola icona. Altri browser HTML5 come Safari e Chrome vengono visualizzati come un campo di testo, lo stesso di type="text", quindi i tuoi utenti non noteranno la differenza (finché non guardano il codice sorgente).

E poi c'è l'iPhone.

L'iPhone non ha una tastiera fisica. Tutta la "digitazione" viene eseguita toccando la tastiera su schermo che viene visualizzata al momento opportuno, ad esempio quando si accede a un campo modulo su una pagina Web. Apple ha fatto qualcosa di complicato nel browser dell'iPhone. Riconosce alcuni nuovi campi HTML5 e cambia dinamicamente la tastiera su schermo per ottimizzare l'input.

Ad esempio, un indirizzo email è un testo, giusto? Certo, ma è un tipo speciale di testo. Ad esempio, quasi tutti gli indirizzi e-mail contengono il simbolo @ e almeno un punto (.), ma è improbabile che contengano uno spazio. Quindi, quando usi un iPhone e navighi verso un elemento , otterrai una tastiera su schermo che contiene meno spazio del normale, oltre a tasti carattere dedicati. e @.

Lasciami riassumere. Non c'è alcun aspetto negativo nel convertire immediatamente tutti i campi del tuo indirizzo email in type="email" . Praticamente nessuno se ne accorgerà, ad eccezione degli utenti iPhone, che probabilmente non lo faranno neanche. Ma quelli che se ne accorgono sorrideranno dolcemente e ti ringrazieranno per aver reso il loro lavoro un po' più facile.

Indirizzi web

L'indirizzo web - che i nerd degli standard chiamavano URL, ad eccezione di alcuni pedanti che chiamavano URI - è un altro tipo di testo specializzato. La sintassi di un indirizzo Web è limitata dallo standard Internet pertinente. Se qualcuno ti chiede di inserire un indirizzo web in un modulo, si aspetta qualcosa come "http://www.google.com/", non "125 Farwood Road". Le barre sono comuni: anche la home page di Google ne ha tre. Anche i periodi sono comuni, ma gli spazi sono vietati. E ogni indirizzo web ha un suffisso di dominio come ".com" o ".org".

E così... (rullo di tamburi per favore)... . Su iPhone, sembra così.

L'iPhone ha cambiato la sua tastiera virtuale come per un indirizzo e-mail, ma ora l'ha ottimizzata per digitare un indirizzo web. Lo spazio è stato completamente sostituito da tre chiavi virtuali: barra, punto e ".com" (puoi tenere premuto il tasto ".com" per selezionare un suffisso diverso come ".org" o ".net").

I browser che non supportano HTML5 tratteranno type="url" come se fosse type="text" , quindi non ci sono svantaggi nell'usare questo tipo per tutti i campi in cui è necessario inserire un indirizzo web.

I numeri come contatori

Prossimo passo: i numeri. Chiedere un numero è più complesso che chiedere un'e-mail o un indirizzo web. Prima di tutto, i numeri sono più complicati di quanto pensi. Seleziona rapidamente un numero. -uno? No, intendevo un numero compreso tra 1 e 10,7 ½? No, no, non una frazione, idiota. π? Ora hai appena scelto un numero irrazionale.

Vorrei sottolineare che non ti viene chiesto spesso "solo un numero". È più probabile che richiedano un numero in un determinato intervallo. Potresti volere solo determinati tipi di numeri all'interno di quell'intervallo - forse interi, ma non frazioni o decimali o qualcosa di più esotico come multipli di 10. HTML5 copre tutto questo.

Scegli un numero, quasi qualsiasi

min="0"
massimo="10"
passo="2"
valore="6">

Diamo un'occhiata a un attributo.

  • type="numero" significa che è un campo numerico.
  • min="0" specifica il valore minimo consentito per questo campo.
  • max="10" è il valore massimo consentito.
  • step="2" in combinazione con il valore minimo definisce numeri validi nell'intervallo: 0, 2, 4 e così via, fino al valore massimo.
  • value="6" valore predefinito. Dovrebbe sembrare familiare, lo stesso attributo viene sempre utilizzato per definire i valori dei campi del modulo. Ne parlo qui come punto di partenza che HTML5 si basa su versioni precedenti di HTML. Non devi reimparare a fare quello che hai fatto prima.

Questo è il codice del campo numerico. Tieni presente che tutti questi attributi sono facoltativi. Se hai un minimo ma non un massimo, puoi specificare l'attributo min, ma non l'attributo max. Il valore del passaggio predefinito è 1 ed è possibile omettere l'attributo del passaggio finché non è necessario un valore del passaggio diverso. Se non esiste un valore predefinito, l'attributo value può essere una stringa vuota o addirittura omesso del tutto.

Ma HTML5 non si ferma qui. Per lo stesso prezzo basso e basso della libertà, ottieni questi metodi di convenienza JavaScript.

  • input.stepUp(n) aumenta il valore del campo di n.
  • input.stepDown(n) abbassa il valore del campo di n.
  • input.valueAsNumber restituisce il valore corrente come float (la proprietà input.value è sempre una stringa).

Problemi di visualizzazione? Bene, l'interfaccia corretta per manipolare i numeri nei browser è implementata in modo diverso. Su iPhone, dove la digitazione è difficile, il browser ottimizza nuovamente la tastiera virtuale per la digitazione dei numeri.

Nella versione desktop di Opera, il campo type="number" appare come un contatore con piccole frecce su e giù su cui è possibile fare clic per modificare i valori.

L'opera rispetta gli attributi min , max e step, quindi otterrai sempre un valore numerico ragionevole. Se si aumenta il valore al massimo, la freccia su nel contatore diventa grigia.

Come per tutti gli altri campi di input di cui ho discusso in questo capitolo, i browser che non supportano type="number" lo tratteranno come type="text" . Il valore predefinito verrà visualizzato nel campo (poiché è memorizzato nell'attributo value), ma altri attributi come min e max verranno ignorati. Sei libero di implementarli tu stesso o di utilizzare un framework JavaScript che implementa già la gestione dei contatori. Per prima cosa controlla come qui.

if(!.inputtypes.number)(
// nessun supporto nativo per il tipo di campo=numero
// potrebbe provare Dojo o un altro framework JavaScript
}

Numeri di scorrimento

Il contatore non è l'unico modo per rappresentare l'input di numeri. Probabilmente hai anche visto uno slider simile a questo.

Ora puoi anche avere un cursore sul modulo. Il codice sembra stranamente simile a un campo contatore.

min="0"
massimo="10"
passo="2"
valore="6">

Tutti gli attributi disponibili sono gli stessi di type="number" - min , max , step , value - e significano la stessa cosa. L'unica differenza è nell'interfaccia utente. Invece di un campo di input, i browser dovrebbero visualizzare type="range" come dispositivo di scorrimento. Al momento in cui scrivo, le ultime versioni di Safari, Chrome e Opera funzionano con questo. Sfortunatamente, l'iPhone viene visualizzato come un semplice campo di testo, non ottimizza nemmeno la sua tastiera su schermo per l'immissione di numeri. Tutti gli altri browser trattano semplicemente il campo come type="text" , quindi non c'è motivo di iniziare a utilizzare quel tipo immediatamente.

HTML 4 non include il selettore della data tramite calendario. I framework JavaScript ti consentono di aggirare questo problema (Dojo , jQuery UI , YUI , Closure Library), ma ovviamente ognuna di queste soluzioni richiede che il framework sia "incorporato" per qualsiasi calendario incorporato.

HTML5 definisce finalmente un modo per abilitare il selettore di date integrato senza alcuno script. In realtà ce ne sono sei: data, mese, settimana, ora, data + ora e data + ora con un fuso orario.

Finora, il supporto... è scarso.

Supporto per la selezione della data
Tipo di musica lirica Altri browser
digita = "data" 9.0+ -
digita = "mese" 9.0+ -
digita = "settimana" 9.0+ -
digita = "ora" 9.0+ -
digita = "data ora" 9.0+ -
digita = "data e ora locale" 9.0+ -

Ecco come si presenta Opera :

Se hai bisogno dell'ora insieme alla data, anche Opera supporta :

Se hai bisogno di un mese più un anno (es. data di scadenza della carta di credito), Opera può visualizzare :

Meno comune, ma disponibile, è la scelta della settimana dell'anno via :

Ultimo ma non meno importante è il tempismo di :

Selettore data con alternativa




...

È probabile che altri browser alla fine supporteranno questi tipi. Come type="email" e altri tipi, questi campi modulo verranno visualizzati come testo normale nei browser che non riconoscono type="date" e le sue varianti. Se vuoi puoi semplicemente usare che rendere felici gli utenti di Opera e aspettare che altri browser raggiungano il ritardo. È più realistico da usare , ma controlla se il browser ha il supporto per la selezione della data integrato e includi una soluzione di script alternativa a tua scelta (Dojo , jQuery UI , YUI , Closure Library o altre opzioni).

Finestra di ricerca

Quindi cerca. Non solo ricerche da Google o Yahoo (beh, anche quelle). Pensa a qualsiasi casella di ricerca, su qualsiasi pagina, su qualsiasi sito. Amazon ha una casella di ricerca, Yandex ha una casella di ricerca, anche la maggior parte dei blog. Come sono fatti? , proprio come qualsiasi altro campo di testo sul Web. Risolviamo questo problema.

Cerca una nuova generazione




In alcuni browser non noterai alcuna differenza rispetto a un normale campo di testo. Ma se stai usando Safari su Mac OS X, sarà simile a questo.

Hai trovato una differenza? Il campo di immissione ha gli angoli arrotondati! Lo so, lo so, difficilmente riesci a contenere i tuoi sentimenti. Ma aspetta, non è tutto! Quando inizi a digitare nel campo type="search", Safari inserirà un piccolo pulsante "x" sul lato destro della finestra. Cliccando su "x" si cancella il contenuto del campo. Google Chrome, che ha la stessa tecnologia sotto il cofano, si comporta allo stesso modo. Entrambi questi piccoli trucchi sembrano e si comportano in modo simile alla ricerca nativa in iTunes e in altre applicazioni client di Mac OS X.

utilizza Apple.com per cercare nel tuo sito, per aiutare il sito a trasmettere una sensazione di "fidanzamento". Ma qui non c'è nulla di specifico per Mac. È solo un codice in modo che ogni browser su qualsiasi piattaforma possa scegliere come visualizzare secondo le convenzioni della piattaforma. Come con tutti gli altri nuovi tipi, i browser che non riconoscono type="search" lo tratteranno come type="text" , quindi non c'è assolutamente alcun motivo per non iniziare a utilizzare type="search" per tutte le tue caselle di ricerca oggi. .

dice il professor Markup

Per impostazione predefinita, Safari non si applica a la maggior parte degli stili. Se vuoi forzare Safari a trattare il campo di ricerca come un normale campo di testo (per applicare i tuoi stili), aggiungi questa regola al tuo foglio di stile.

ingresso(
-aspetto-webkit:campo di testo;
}

Grazie a John Lane per avermi insegnato questo trucco.

Selezione del colore

HTML5 definisce anche un campo , che consente di selezionare un colore e di restituirlo in notazione esadecimale. Nessun browser supporta la selezione dei colori, il che è un peccato perché ho sempre amato le tavolozze di Mac OS. Forse un giorno.

Nota. traduttore. Opera 11 supporta questa funzione.

Convalida del modulo

In questo capitolo ho parlato di nuovi elementi del modulo e nuove funzionalità come l'autofocus, ma non ho menzionato forse la parte più interessante dei moduli HTML5: la convalida automatica dell'input. Diamo un'occhiata ai problemi comuni relativi all'inserimento di un indirizzo e-mail in un modulo. Probabilmente hai la convalida lato client tramite JavaScript seguita dalla convalida lato server tramite PHP, Python o un altro linguaggio lato server. HTML5 non sostituirà mai la convalida lato server, ma un giorno potrebbe sostituire la convalida lato client.

Ci sono due grossi problemi con la convalida dell'indirizzo email JavaScript:

  1. Alcuni dei tuoi visitatori (probabilmente circa il 10%) non hanno JavaScript abilitato.
  2. Riceverai un indirizzo errato.

Seriamente, otterrai l'indirizzo sbagliato. Determinare che un insieme di caratteri casuali sia un indirizzo email valido è incredibilmente difficile. Più guardi duro, più diventa difficile. Ho già detto che è molto, molto difficile? Non è più facile appendere questo mal di testa al tuo browser?

Opera controlla type="email"

Ecco uno screenshot di Opera 11, sebbene la funzionalità sia presente da Opera 9. Il codice include l'impostazione dell'attributo type su email. Quando un utente di Opera tenta di inviare un modulo con , il browser controlla automaticamente l'indirizzo email anche se gli script sono disabilitati.

HTML5 offre anche la convalida dell'indirizzo web con un campo e numeri con . La convalida del numero rispetta i valori degli attributi minimo e massimo, quindi i browser non ti consentiranno di inviare il modulo se inserisci un numero troppo grande.

Non c'è codice per abilitare la convalida del modulo in HTML5, questo viene fatto per impostazione predefinita. Per disabilitare la convalida, utilizzare l'attributo novalidate.

Non mettermi alla prova




I browser stanno lentamente abilitando il supporto per la convalida dei moduli in HTML5. Firefox 4 avrà il pieno supporto. Sfortunatamente, Safari e Chrome lo implementano solo parzialmente: convalidano gli elementi del modulo, ma non visualizzano alcun messaggio visibile quando i campi del modulo non superano la convalida. In altre parole, se inserisci una data non valida (o errata) in type="date" , Safari e Chrome non invieranno il modulo, ma non ti diranno perché non l'hanno fatto. Metteranno lo stato attivo su un campo che contiene un valore non valido, ma non visualizzeranno un messaggio di errore come Opera o Firefox 4.

Campi richiesti

Supporto
CIOÈ Firefox safari Cromo musica lirica i phone Androide
- 4.0+ - - 9.0+ - -

La convalida dei moduli in HTML5 non è limitata al tipo di ciascun campo. Puoi anche specificare che alcuni campi sono obbligatori, tali campi devono avere un valore prima di poter inviare il modulo.

Il codice per i campi obbligatori è il più semplice possibile.




I browser possono modificare l'aspetto predefinito di un campo obbligatorio. Ecco un esempio di come appare in Mozilla Firefox 4.0.

Inoltre, se si tenta di inviare un modulo senza compilare un valore richiesto, Firefox visualizzerà una barra delle informazioni che indica che il campo è obbligatorio e non può essere vuoto.

Diciamo che abbiamo bisogno di ottenere dati dal sito, la cui raccolta manualmente è impraticabile o impossibile a causa del volume. In tal caso, possiamo automatizzare il processo utilizzando gli strumenti descritti di seguito.

richieste libreria

Libreria Python per effettuare richieste al server ed elaborare risposte. Il fondamento dello script di analisi e la nostra arma principale. Usando questa libreria, otteniamo il contenuto della pagina sotto forma di html per un'ulteriore analisi.

richieste di importazione risposta = richieste. get ("https://ya.ru" ) # get-request print (risposta . testo) # stampa il contenuto della pagina carico utile = ("chiave1": "valore1", "chiave2": "valore2") risposta = richieste. get("http://httpbin.org/get" , params = payload ) # richiesta con parametri headers = ("user-agent" : "my-app/0.0.1" ) response = request . get(url, headers = headers) # richiesta con intestazioni html specifiche

API

Interfaccia di programmazione dell'applicazione: un'interfaccia di programmazione dell'applicazione fornita dal proprietario dell'applicazione Web ad altri sviluppatori. La mancanza di un'API in grado di soddisfare le nostre esigenze è la prima cosa da accertarsi prima di affrettarsi ad analizzare il codice sorgente della pagina e scrivere un parser per esso. Molti siti popolari hanno la propria API e documentazione che spiega come usarla. Possiamo usare API in questo modo: formiamo una richiesta http in base alla documentazione e otteniamo una risposta utilizzando le richieste.

BS4

Beautifulsoup4 è una libreria per l'analisi di documenti html e xml. Consente di accedere direttamente al contenuto di eventuali tag in html.

from bs4 import BeautifulSoup soup = BeautifulSoup (raw_html , "html.parser" ) print (soup . find ("p" , class_ = "some-class" ) . text ) # stampa il contenuto del tag "p" della classe "some-class"

Driver Web Selenio

I dati sul sito possono essere generati dinamicamente utilizzando javascript. In questo caso, request + bs4 non saranno in grado di analizzare questi dati. Il fatto è che bs4 analizza il codice sorgente della pagina senza eseguire js. Per eseguire il codice js e ottenere una pagina identica a quella che vediamo nel browser, puoi utilizzare il driver web selenium: si tratta di un insieme di driver per vari browser, forniti con le librerie per lavorare con questi driver.

E se c'è l'autorizzazione?

session = request.Session() data = ("login_username":"login", "login_password":"password") url = "http://site.com/login.php" response = session.post(url, data =dati)

Ma cosa succede se il sito viene bannato per molte richieste?

  • Imposta il ritardo tra le richieste:

response = request.get(url, timeout=(10, 0.01)) # timeout connessione, timeout lettura (in secondi)

  • Fingere di essere un browser che utilizza il driver web selenio o passando il contenuto dell'intestazione dell'agente utente, facendo una richiesta:

user_agent = ("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) " "Gecko/20100101 Firefox/50.0") request = request.get(url, headers=("User-Agent":user_agent))

  • Usa un proxy:

Per ottenere un'istanza di questa classe, utilizzare la chiamata al metodo wa()->getResponse(), ad esempio:

Wa()->getResponse()->getHeader("Tipo di contenuto")

Metodi

funzione pubblica aggiungi CSS ($url, $app_id = falso)

Aggiunge un URL all'elenco dei file CSS. Tutti gli URL dei file CSS aggiunti possono essere recuperati nel modello Smarty utilizzando il metodo ($wa->css()).

Opzioni

  • $url

    L'URL relativo del file CSS. Se viene specificato il valore del parametro $app_id, è necessario specificare l'URL del file rispetto all'URL della directory con i file dell'applicazione corrispondente. In caso contrario, l'URL relativo dovrebbe essere relativo alla directory di installazione del framework.

  • $app_id

    ID applicazione.

Esempio

wa()->getResponse()->addCss("css/myapp.css", "myapp");

funzione pubblica aggiungi Google Analytics ($str)

Aggiunge uno snippet JavaScript per Google Analytics. Il codice di Google Analytics (compreso quello aggiunto con questo metodo) è incluso nel modello HTML del sito utilizzando il metodo ($wa->headJs()).

Opzioni

  • $str

    Frammento di codice JavaScript.

funzione pubblica addHeader ($nome, $valore, $sostituisci = vero)

Aggiunge un'intestazione che verrà inviata dal server in risposta a una richiesta dell'utente. Tutte le intestazioni aggiunte in questo modo verranno inviate all'utente durante l'esecuzione di .

Opzioni

  • $ nome

    Nome del titolo.

  • $ valore

    Valore del titolo.

  • $sostituire

    Un flag che indica che il valore precedentemente impostato per l'intestazione specificata deve essere sostituito.

Esempio

wa()->getResponse()->addHeader("Tipo di contenuto", "applicazione/json");

funzione pubblica addJs ($url, $app_id = falso)

Aggiunge un URL all'elenco dei file JavaScript. Tutti gli URL JavaScript aggiunti possono essere recuperati nel modello Smarty utilizzando il metodo ($wa->js()).

Opzioni

  • $url

    L'URL del file JavaScript. Se viene specificato il valore del parametro $app_id, è necessario specificare l'URL del file rispetto all'URL della directory con i file dell'applicazione corrispondente. In caso contrario, l'URL relativo dovrebbe essere relativo alla directory di installazione del framework.

  • $app_id

    ID applicazione.

Esempio

wa()->getResponse()->addJs("js/myapp.js", "myapp");

funzione pubblica getCss ($html = vero, $rigoroso = falso)

Restituisce un elenco di collegamenti a file CSS aggiunti in precedenza.

Opzioni

  • $html

    Flag che indica la necessità di restituire il codice HTML per il collegamento dei file CSS. Se viene specificato false, il metodo restituisce un array di URL di tali file.

  • $ severo

    Flag per indicare che il formato XHTML viene utilizzato al posto dell'HTML quando $html è impostato su true .

Esempio

wa()->getResponse()->getCss();

funzione pubblica getHeader ($nome = nullo)

Restituisce il valore dell'intestazione della risposta.

Opzioni

  • $ nome

    L'ID dell'intestazione il cui valore deve essere restituito. Se non specificato, il metodo restituisce l'intera matrice corrente di intestazioni.

Esempio

wa()->getResponse()->addHeader("Tipo di contenuto", "applicazione/json"); wa()->getResponse()->getHeader("Tipo di contenuto");

Risultato

applicazione/json

funzione pubblica getJs ($html = vero)

Restituisce un elenco di riferimenti ai file di risposta JavaScript.

Opzioni

  • $html

    Un flag facoltativo che indica la necessità di restituire il codice HTML per la connessione di file JavaScript. In caso contrario, il metodo restituisce l'array corrente di URL di file.

Esempio

wa()->getResponse()->getJs();

funzione pubblica get Meta ($nome = nullo)

Restituisce il contenuto dei dati META: titolo della pagina ("titolo"), parole chiave dei tag META ("parole chiave"), descrizione ("descrizione").

Opzioni

  • $ nome

    L'ID dell'elemento dati META il cui valore deve essere restituito. Se non specificato, il metodo restituisce l'intero array corrente di dati META.

Esempio

wa()->getResponse()->getMeta("parole chiave");

funzione pubblica getStatus()

Restituisce lo stato della risposta del server precedentemente impostato.

Esempio

wa()->getResponse()->setStatus(200); wa()->getResponse()->getStatus();

Risultato

200

funzione pubblica getTitolo()

Restituisce il titolo (TITLE) della pagina.

Esempio

wa()->getResponse()->setTitle("Il mio negozio online"); wa()->getResponse()->getTitle();

Risultato

Il mio negozio online

funzione pubblica reindirizzare ($url, $codice = nullo)

Reindirizza l'utente all'URL specificato.

Opzioni

  • $url

    L'URL a cui l'utente deve essere reindirizzato.

  • $codice

    Il codice di risposta del server che dovrebbe accompagnare il reindirizzamento.

Esempio

wa()->getResponse()->redirect("http://otherdomain.ru/", 301);

funzione pubblica sendHeaders()

Invia le intestazioni precedentemente impostate.

Esempio

wa()->getResponse()->addHeader("Tipo di contenuto", "applicazione/json"); wa()->getResponse()->sendHeaders();

funzione pubblica setCookie ($nome, $valore, $scade = nullo, $percorso = nullo, $dominio = "", $secure = false, $http_only = false)

Imposta il valore di una voce di cookie utilizzando la funzione PHP setcookie.

Opzioni

  • $ nome

    ID record.

  • $ valore

    Il valore della voce.

  • $ scade

    Data di scadenza.

  • $percorso

    Il percorso della "sottodirectory" dell'URI all'interno della quale è valido il valore della voce.

  • $dominio

    Il nome di dominio per il quale è valido il valore della voce.

  • $sicuro

    Un flag che indica che la scrittura è disponibile solo se il valore viene trasmesso tramite il protocollo HTTPS.

  • $ http_solo

    Un flag che indica che il valore del record è disponibile solo tramite il protocollo HTTP e non è accessibile tramite gli script client (JavaScript).

Esempio

wa()->getResponse()->setCookie("code", $code, time() + 30 * 86400, null, "", false, true);

funzione pubblica setMeta ($nome, $valore = nullo)

Imposta il valore dei dati META. Questo valore è disponibile nei modelli Smarty utilizzando il metodo ($wa->meta()).

Opzioni

  • $ nome

    Identificatore dell'elemento dati META: titolo della pagina ("titolo"), parole chiave dei tag META ("parole chiave") e descrizione ("descrizione").

  • $ valore

    Il valore dell'elemento.

Esempio

wa()->getResponse()->setMeta("parole chiave", $parole chiave);

funzione pubblica setStatus ($codice)

Imposta lo stato della risposta del server.

Opzioni

  • $codice

    Codice di stato

Esempio

wa()->getResponse()->setStatus(404);

funzione pubblica setTitolo ($titolo)

Imposta il titolo (TITLE) della pagina. Il contenuto del titolo è disponibile nei modelli Smarty utilizzando il metodo ($wa->title()).

Generazione di risposta dai controller

Dopo che il controller ha terminato l'elaborazione della richiesta, di solito è necessario generare una risposta. Quando creiamo un controller di basso livello implementando direttamente l'interfaccia IController, dobbiamo assumerci la responsabilità di ogni aspetto dell'elaborazione della richiesta, inclusa la generazione di una risposta al cliente.

Ad esempio, per inviare una risposta HTML, è necessario creare e comporre dati HTML, quindi inviarli al client utilizzando il metodo Response.Write(). Allo stesso modo, per reindirizzare il browser dell'utente a un URL diverso, è necessario chiamare il metodo Response.Redirect() e passargli l'URL richiesto. Entrambi gli approcci sono illustrati nel codice seguente, che mostra le estensioni alla classe BasicController che abbiamo creato in un articolo precedente utilizzando un'implementazione dell'interfaccia IController:

Utilizzo di System.Web.Mvc; utilizzando System.Web.Routing; namespace ControllersAndActions.Controllers ( public class BasicController: IController ( public void Execute(RequestContext requestContext) ( string controller = (string)requestContext.RouteData.Values["controller"]; string action = (string)requestContext.RouteData.Values["action "]; if (action.ToLower() == "redirect") ( requestContext.HttpContext.Response.Redirect("/Derived/Index"); ) else ( requestContext.HttpContext.Response.Write(string.Format("Controller : (0), Metodo di azione: (1)", controller, azione)); ) ) ) )

Lo stesso approccio può essere applicato se il controller è ereditato dalla classe Controller. La classe HttpResponseBase restituita durante la lettura della proprietà requestContext.HttpContext.Response nel metodo Execute() è disponibile tramite la proprietà Controller.Response, come illustrato nell'esempio seguente, che estende la classe DerivedController, anch'essa creata in precedenza derivando dalla Classe controller:

Utilizzo del sistema; utilizzando System.Web; utilizzando System.Web.Mvc; namespace ControllersAndActions.Controllers ( public class DerivedController: Controller ( public ActionResult Index() ( // ... ) public void ProduceOutput() ( if (Server.MachineName == "ProfessorWeb") Response.Redirect("/Basic/Index" ); else Response.Write("Controller: Derived, Action Method: ProduceOutput"); ) ) )

Il metodo ProduceOutput() utilizza il valore della proprietà Server.MachineName per decidere quale risposta inviare al client. ("ProfessorWeb" è il nome della mia macchina di sviluppo.)

Sebbene questo approccio per generare una risposta all'utente funzioni, ci sono diversi problemi con esso:

    Le classi controller devono contenere informazioni sulla struttura HTML o URL, il che rende le classi più difficili da leggere e mantenere.

    Un controller che genera una risposta direttamente all'uscita è difficile da testare in unità. Sarà necessario creare implementazioni fittizie dell'oggetto Response e quindi essere in grado di elaborare l'output dal controller per determinare di cosa si tratta. Ciò può significare, ad esempio, la necessità di implementare l'analisi delle parole chiave del markup HTML, che è un processo lungo e noioso.

    Questa gestione dei dettagli fini di ciascuna risposta è complessa e soggetta a errori. Ad alcuni programmatori piace il controllo assoluto fornito dalla costruzione di un controller di basso livello, ma di solito si complica molto rapidamente.

Fortunatamente, MVC Framework ha uno strumento utile che risolve tutti i problemi menzionati: i risultati delle azioni. Le sezioni seguenti spiegano il concetto di risultati dell'azione e mostrano diversi modi per utilizzarlo per generare risposte dai controllori.

Risultati delle azioni

I risultati dell'azione nel Framework MVC vengono utilizzati per separare le dichiarazioni di intenti dall'esecuzione degli intenti (scusate la tautologia). Il concetto sembra semplice una volta capito, ma ci vuole del tempo per capirlo a causa di alcune indicazioni indirette.

Invece di trattare direttamente con l'oggetto Response, i metodi di azione restituiscono un oggetto di una classe derivata da Risultato dell'azione, che descrive quale dovrebbe essere la risposta del titolare del trattamento, ad esempio il rendering di una vista o il reindirizzamento a un altro URL o metodo di azione. Tuttavia (questo è proprio l'indiretto) la risposta non è generata direttamente. Viene invece creato un oggetto ActionResult che MVC Framework elabora per ottenere il risultato dopo che è stato chiamato il metodo di azione.

L'Action Results System è un esempio del modello di progettazione Command. Questo modello rappresenta gli scenari in cui si salvano e si passano oggetti che descrivono le operazioni da eseguire.

Quando MVC Framework riceve un oggetto ActionResult da un metodo di azione, lo chiama Metodo ExecuteResult() Il definito nella classe di questo oggetto. L'implementazione dei risultati dell'azione opera quindi sull'oggetto Response per generare un output che corrisponde all'intento. Per dimostrarlo in azione, creiamo una cartella Infrastructure e aggiungiamo un nuovo file di classe denominato CustomRedirectResult.cs con un'implementazione ActionResult personalizzata mostrata nell'esempio seguente:

Utilizzo di System.Web.Mvc; namespace ControllersAndActions.Infrastructure ( public class CustomRedirectResult: ActionResult ( public string Url ( get; set; ) public override void ExecuteResult(ControllerContext context) ( string fullUrl = UrlHelper.GenerateContentUrl(Url, context.HttpContext); context.HttpContext.Response.Redirect (URL completo); ) ) )

Questa classe si basa sul modo in cui funziona la classe System.Web.Mvc.RedirectResult. Uno dei vantaggi del framework MVC open source ha a che fare con la capacità di esplorare il funzionamento interno di qualsiasi cosa. La classe CustomRedirectResult è molto più semplice dell'equivalente MVC, ma è sufficiente per gli scopi di questo articolo.

Quando si crea un'istanza della classe RedirectResult, si passa l'URL a cui l'utente deve essere reindirizzato. Il metodo ExecuteResult(), che verrà eseguito da MVC Framework al completamento del metodo action, riceve l'oggetto Response per la richiesta tramite l'oggetto ControllerContext fornito dal framework e chiama il metodo RedirectPermanent() o il metodo Redirect() (questo è esattamente ciò che è stato fatto all'interno dell'implementazione di basso livello di IController nell'esempio precedente nell'articolo).

L'uso della classe CustomRedirectResult è illustrato nell'esempio seguente, che mostra le modifiche apportate al controller Derivato:

// ... utilizzando ControllersAndActions.Infrastructure; namespace ControllersAndActions.Controllers ( public class DerivedController: Controller ( public ActionResult Index() ( // ... ) public ActionResult ProduceOutput() ( if (Server.MachineName == "MyMachineName") restituisce new CustomRedirectResult ( Url = "/Basic/ Index" ); else ( Response.Write("Controller: Derived, Action Method: ProduceOutput"); return null; ) ) ) )

Si noti che siamo stati costretti a modificare il risultato del metodo di azione per restituire un ActionResult. Restituiamo null se non vogliamo che il Framework MVC esegua nulla quando il nostro metodo di azione è stato completato, che è ciò che ha fatto se non è stata restituita un'istanza CustomRedirectResult.

Controller e azioni di unit test

Molte parti di MVC Framework sono progettate per semplificare i test di unità, e questo è particolarmente vero per le azioni e i controller. Ci sono diverse ragioni per questo supporto:

    Puoi testare azioni e controller al di fuori del server web. Gli oggetti di contesto sono accessibili tramite le loro classi di base (come HttpRequestBase), che è facile da imitare.

    Non è necessario analizzare il markup HTML per testare i risultati di un metodo di azione. È possibile esaminare l'oggetto ActionResult restituito per assicurarsi di ottenere i risultati previsti.

    Non è necessaria l'emulazione delle richieste dei clienti. Il sistema di associazione del modello MVC Framework consente di scrivere metodi di azione che ricevono input nei relativi parametri. Per testare un metodo di azione, devi semplicemente chiamarlo direttamente e fornire i valori dei parametri appropriati.

Gli articoli futuri sulla generazione di dati dai controllori ti mostreranno come creare unit test per diversi tipi di risultati di azioni.

Non dimenticare che il test unitario è solo una parte del quadro. Il comportamento complesso in un'applicazione si verifica quando i metodi di azione vengono chiamati in sequenza. Il test unitario è meglio combinato con altri approcci di test.

Ora che sai come funziona il risultato dell'azione di reindirizzamento personalizzato, puoi passare al suo equivalente, fornito dal framework MVC, che è potente e ampiamente testato da Microsoft. La modifica richiesta al controllore derivato è riportata di seguito:

// ... public ActionResult ProduceOutput() ( return new RedirectResult("/Basic/Index"); ) // ...

L'istruzione condizionale è stata rimossa dal metodo di azione, il che significa che dopo l'avvio dell'applicazione e il passaggio a un URL come /Derived/ProduceOutput, il browser verrà reindirizzato a un URL come /Basic/Index. Per semplificare il codice del metodo di azione, la classe Controller include metodi pratici per la generazione di vari tipi di oggetti ActionResult. Pertanto, ad esempio, possiamo ottenere lo stesso effetto dell'esempio precedente restituendo il risultato del metodo Redirect():

// ... public ActionResult ProduceOutput() ( return Redirect("/Basic/Index"); ) // ...

Non c'è nulla di particolarmente complesso nel sistema dei risultati dell'azione, ma alla fine aiuta a ottenere un codice più semplice, più pulito e coerente, facile da leggere e da testare in unità. Ad esempio, nel caso di un reindirizzamento, puoi semplicemente verificare che il metodo action restituisca un'istanza RedirectResult la cui proprietà Url contiene la destinazione prevista.

Il Framework MVC definisce molti tipi di risultati di azione incorporati, descritti nella tabella seguente:

Tipi di risultati ActionResult integrati
Tipo di Descrizione Metodi di supporto della classe Controller
Visualizzarisultato

Esegue il rendering del modello di vista specificato o standard

Visualizzazione()
Risultato vista parziale

Esegue il rendering del modello di vista parziale specificato o standard

Vista parziale()
RedirectToRouteResult

Emette un reindirizzamento HTTP 301 o 302 al metodo di azione o alla voce di percorso specificata, generando un URL in base alla configurazione di instradamento

Reindirizzamento all'azione()
RedirectToActionPermanent()
RedirectToRoute()
RedirectToRoutePermanent()
Reindirizzamento Risultato

Emette un reindirizzamento HTTP 301 o 302 all'URL specificato

reindirizzare()
Reindirizzamento Permanente()
ContentResult

Restituisce dati di testo non formattati al browser, impostando facoltativamente l'intestazione del tipo di contenuto

contenuto()
FileRisultato

Passa i dati binari (come un file su disco o un array di byte in memoria) direttamente al browser

File()
Risultato Json

Serializza un oggetto .NET in formato JSON e lo invia come risposta. Risposte di questo tipo vengono generate più spesso quando si utilizza l'API Web e gli strumenti AJAX.

json()
JavaScriptRisultato

Invia un pezzo di codice sorgente JavaScript che deve essere eseguito dal browser

JavaScript()
HttpUnauthorizedResult

Imposta il codice di stato della risposta HTTP su 401 (che significa "non autorizzato"), che fa sì che il meccanismo di autenticazione corrente (Autenticazione moduli o Autenticazione Windows) richieda al visitatore di accedere

Non
HttpNotFoundResult

Restituisce un errore HTTP con codice 404 - Non trovato (non trovato)

HttpNotFound()
HttpStatusCodeResult

Restituisce il codice HTTP specificato

Non
Risultato vuoto

Facendo nulla

Non

Tutti questi tipi sono derivati ​​dalla classe ActionResult e molti di essi hanno utili metodi di supporto nella classe Controller. Dimostreremo l'uso di questi tipi di risultati negli articoli successivi.