Le risposte sono molto buone, ma nell'ultima versione di MVC e .NET c'è un altro modo che mi piace molto usare, invece delle chiavi FormCollection e Request "vecchia scuola".
Considera uno snippet HTML contenuto in un tag form che esegue un AJAX o FORM POST.
<input type="hidden" name="TrackingID"
<input type="text" name="FirstName" id="firstnametext" />
<input type="checkbox" name="IsLegal" value="Do you accept terms and conditions?" />
Il controller analizzerà effettivamente i dati del modulo e proverà a fornirteli come parametri del tipo definito. Ho incluso la casella di controllo perché è complicata. Restituisce il testo "on" se spuntato e null se non spuntato. Il requisito però è che queste variabili definite DEVONO esistere (a meno che nullable (ricorda anche se string
è nullable)) altrimenti l'AJAX o il POST non riusciranno.
[HttpPost]
public ActionResult PostBack(int TrackingID, string FirstName, string IsLegal){
MyData.SaveRequest(TrackingID,FirstName, IsLegal == null ? false : true);
}
Puoi anche postare indietro un modello senza utilizzare alcun aiutante di rasoio. Mi sono accorto che questo è necessario alcune volte.
public Class HomeModel
{
public int HouseNumber { get; set; }
public string StreetAddress { get; set; }
}
Il markup HTML sarà semplicemente ...
<input type="text" name="variableName.HouseNumber" id="whateverid" >
e il tuo controller (Razor Engine) intercetterà la Form Variable "variableName" (il nome è come preferisci ma mantienilo coerente) e proverà a costruirlo e trasmetterlo a MyModel.
[HttpPost]
public ActionResult PostBack(HomeModel variableName){
postBack.HouseNumber; //The value user entered
postBack.StreetAddress; //the default value of NULL.
}
Quando un controller si aspetta un modello (in questo caso HomeModel) non è necessario definire TUTTI i campi poiché il parser li lascerà semplicemente al valore predefinito, di solito NULL. La cosa bella è che puoi mescolare e abbinare vari modelli sul mark-up e il post back parse verrà popolato il più possibile. Non è necessario definire un modello sulla pagina o utilizzare gli helper.
SUGGERIMENTO: il nome del parametro nel controller è il nome definito nel markup HTML "name =" non il nome del modello ma il nome della variabile prevista nel!
L'uso List<>
è un po 'più complesso nel suo mark-up.
<input type="text" name="variableNameHere[0].HouseNumber" id="id" value="0">
<input type="text" name="variableNameHere[1].HouseNumber" id="whateverid-x" value="1">
<input type="text" name="variableNameHere[2].HouseNumber" value="2">
<input type="text" name="variableNameHere[3].HouseNumber" id="whateverid22" value="3">
L'indice su elenco <> DEVE sempre essere in base zero e sequenziale. 0,1,2,3.
[HttpPost]
public ActionResult PostBack(List<HomeModel> variableNameHere){
int counter = MyHomes.Count()
foreach(var home in MyHomes)
{ ... }
}
Utilizzo IEnumerable<>
per gli indici non a base zero e non sequenziali postback. Dobbiamo aggiungere un input nascosto extra per aiutare il raccoglitore.
<input type="hidden" name="variableNameHere.Index" value="278">
<input type="text" name="variableNameHere[278].HouseNumber" id="id" value="3">
<input type="hidden" name="variableNameHere.Index" value="99976">
<input type="text" name="variableNameHere[99976].HouseNumber" id="id3" value="4">
<input type="hidden" name="variableNameHere.Index" value="777">
<input type="text" name="variableNameHere[777].HouseNumber" id="id23" value="5">
E il codice deve solo usare IEnumerable e chiamare ToList()
[HttpPost]
public ActionResult PostBack(IEnumerable<MyModel> variableNameHere){
int counter = variableNameHere.ToList().Count()
foreach(var home in variableNameHere)
{ ... }
}
Si consiglia di utilizzare un singolo modello o un ViewModel (il modello che contiene altri modelli per creare un modello "Visualizza" complesso) per pagina. Mescolare e abbinare come proposto potrebbe essere considerato una cattiva pratica, ma fintanto che funziona e sia leggibile non è MALE. Tuttavia, dimostra la potenza e la flessibilità del motore Razor.
Quindi, se devi inserire qualcosa di arbitrario o sovrascrivere un altro valore da un helper Razor, o semplicemente non hai voglia di creare i tuoi helper, per un singolo modulo che utilizza una combinazione insolita di dati, puoi usare rapidamente questi metodi per accettare extra dati.