2010-08-23 13 views
5

Quando provo la seguente struttura, si does't mando id=valueModulo HTML: perché l'azione non può avere valore in essa?

<form action="some.php?id=value" method="get"> 
    <input name="name1" value="value1"> 
    <input type="submit"> 
</form> 

So che io possa inviare id=value nel campo nascosto, ma è interessante, perché non permette tale struttura?

+0

Cosa intendi con "non invia"? Qual è l'URL a cui viene inviato il modulo? – roryf

+0

dopo averlo inviato verrà reindirizzato a 'some.php? Nome1 = valore1', perde'? Id = valore' – Simon

risposta

5

È perché la sezione "metodo = get" del modulo implica che i valori della query devono provenire dai valori del modulo.

La raccolta che contiene "id = value" è sovrascritta dalla raccolta contenente i valori del modulo.

Questo comportamento sembra essere incorporato in ogni browser, quindi mi aspetto che faccia parte delle specifiche HTML.

Aggiornamento

Ahah:

Questo è stato chiesto prima: submitting a GET form with query string params and hidden params disappear

Per citare:

Come le specifiche (RFC1866, pagina 46; sezione 4.x HTML 17.13.3) stato:

Se il metodo è "get" e l'azione è un URI HTTP, l'agente utente assume il valore di azione, aggiunge un "?" ad esso, quindi aggiunge il set di dati del modulo, codificato utilizzando il tipo di contenuto "application/x-www-form-urlencoded".

1

Se il metodo del modulo è POST, quindi non vedrete id come parte dei valori POST, è possibile utilizzare la raccolta QueryString per accedervi.

+0

io uso il metodo "ottieni" – Simon

+0

Usa il metodo POST, invece, ha molti vantaggi. – RedFilter

+2

Tuttavia non è possibile aggiungere un segnalibro a una pagina POST. Forse vuole una funzione di ricerca in cui le persone possano aggiungere i risultati ai segnalibri o qualcosa di simile. –

0

Che cosa stai cercando di fare? Qual è lo scopo di farlo in questo modo? Se imposti il ​​metodo del tuo modulo su "GET" e poi hai il campo nascosto nel tuo modulo con un nome di "id", esso aggiungerà le variabili get alla fine dell'azione e creerà un url per te.

Aggiornamento: se il browser consentiva la permanenza dei parametri di querystring durante l'aggiunta di parametri da un GET, potrebbe verificarsi una collisione tra i nomi. Potresti facilmente aggiungere un altro parametro di querystring a un URL senza rendersene conto collidendo con un nome di input del modulo.

Per evitare questo, se si utilizza l'azione GET nei moduli, passare tutti i parametri aggiuntivi come input nascosti.

+1

voglio inviare alcuni campi con get, allo stesso tempo non voglio perdere il valore corrente delle mie variabili get. per esempio se ora sono in 'some.php? lang = am' dopo aver inviato ho bisogno di reindirizzare a' some.php? lang = am & fild1_name = campo1_valore ... ' – Simon

+0

Potresti avere collisioni in entrambi i casi. È altrettanto facile creare due ingressi con lo stesso nome. Il comportamento meno sorprendente sarebbe quello di consentire i parametri nell'URL e semplicemente sovrascriverli se esiste un input con lo stesso nome. –

1

non è forse perché questo sarebbe inviare una richiesta a

some.php?id=vaule?name1=value1

invece di

some.php?id=vaule&name1=value1?

Per quanto ne so una stringa di query ha solo un "?" e un "?" viene aggiunto all'URL quando si utilizzano i parametri GET.

+0

In realtà, non è corretto; poiché la parte if = value non viene inviata. Vedi [risposta di Seanyboy] (http://stackoverflow.com/questions/3548795/html-form-why-action-cant-have-get-value-in-it/3548989#3548989) o [mia] (http://stackoverflow.com/questions/3548795/html-form-why-action-cant-have-get-value-in-it/3549258#3549258). – GreenMatt

0

La specifica dei valori nell'URI di azione non avrà alcun effetto, in quanto i valori nell'URI verranno sovrascritti.Per dimostrare, prova il seguente codice HTML e PHP. Il file form_test.html può essere rinominato, ma ovviamente lo script PHP deve essere denominato regurgitate.php (o l'azione nel modulo deve essere modificata).

form_test.html:

<html> 
<head> 
<title>Test of setting form action url</title> 
<body> 
<form action="regurgitate.php?id=value" method="get"> 
<input type="submit" name="Submit"> 
<input type="hidden" id="test" name="test" value="test"> 
</form> 
</body> 

regurgitate.php:

<html> 
<head> 
<title>Test PHP script for testing form action</title> 
<body> 
<?php 
echo "In regurgitate.php<br>\n"; 

foreach ($_GET as $k) { 
    echo "\$_GET['$k']: >" . $_GET["$k"] . "<<br>\n"; 
} 

?> 
</body> 

Quando il pulsante di invio viene cliccato form_test.html, l'URL nel browser diventa qualcosa di simile a:

http://www.example.com/regurgitate.php?Submit=Submit+Query&test=test

Nota non c'è "id = value" nell'URL.

L'output è:

In regurgitate.php
$ _GET [ 'Invia Query']:> <
$ _GET [ 'test']:> prova <

0

Un aggiramento se sai cosa SUPERGLOBAL hai intenzione di utilizzare, prova questo

<?php 
if (isset($_GET['id'])) echo "<input type='hidden' name='id' value='" . $_GET['id'] . "'/>"; 
?> 

Metti questo ovunque nel tuo modulo e aggiungerebbe il campo nascosto per te. Per me va bene.

Se la pagina precedente non conteneva una query poi php sarebbe ignorare l'aggiunta del campo nascosto

+0

Cosa succede se hai 100 parametri? Dovresti aggiungere 100 affermazioni di questo tipo. –

0

Questo comportamento è davvero fastidioso. Una soluzione alternativa consiste nel rilasciare completamente il modulo e creare il tuo URL manualmente sul lato client.

Ho utilizzato jQuery in uno dei nostri progetti .NET per ottenere ciò. È una maschera di ricerca con decine di parametri. Uno di questi è un valore di intervallo (min/max). Usa il cursore per selezionare due valori e devi premere il pulsante di ricerca accanto ad esso.

<!-- Input fields (slider code removed) --> 
<div class="input-fields"> 
    @(Model.Unit) <input type="text" id="@(sliderMinId)" value="@(sliderSelMinVal)" /> 
    to @(Model.Unit) <input type="text" id="@(sliderMaxId)" value="@(sliderSelMaxVal)" /> 
    <input type="button" id="@(sliderButton)" value="Search" /> 
</div> 

E il gestore di eventi per il pulsante:

UrlHelper h = UrlHelperExtensions.CreateRequestAgnosticUrlHelper(); 

/* Search-Button Click-EventHandler */ 
$("#@(sliderButton)").click(function(){ 
    @{ 
     string url = h.Action("Index", "SearchAction", new RouteValueDictionary(searchParams)); 
     string urlSeparator = url.Contains("?") ? "&" : "?"; 
    } 
    var url = '@Html.Raw(url + urlSeparator + sliderInfo.AssociatedFieldName)=' + $("#@Html.Raw(sliderMinId)").val() + '%20-%20' + $("#@Html.Raw(sliderMaxId)").val(); 
    window.location.replace(url); 
}); 

Questo è ciò che accade:

  1. Costruire un'URL che contiene tutti i parametri precedenti.
  2. Aggiunge i nuovi parametri "modulo" ad esso. In questo caso vengono aggiunti come un parametro (min-max). Non lasciare che questo ti confonda.
  3. Reindirizzare al nuovo URL.

Questo è assolutamente imbarazzante per qualcosa che potrebbe essere così semplice ... Spero che questo aiuti.

+0

Che cos'è 'UrlHelperExtensions.CreateRequestAgnosticUrlHelper'? – Kiquenet

+0

@Kiquenet: Purtroppo non ho più accesso a questo codice. Se ricordo correttamente il metodo crea un oggetto UrlHelper che non include parametri dalla richiesta corrente. –

Problemi correlati