As respostas são muito boas, mas há outra maneira na versão mais recente do MVC e .NET que eu realmente gosto de usar, em vez das chaves FormCollection e Request da "velha escola".
Considere um fragmento de HTML contido em uma tag de formulário que faz um AJAX ou 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?" />
Seu controlador irá realmente analisar os dados do formulário e tentar entregá-los a você como parâmetros do tipo definido. Incluí a caixa de seleção porque é complicada. Ele retorna o texto "on" se marcado e nulo se não marcado. O requisito, entretanto, é que essas variáveis definidas DEVEM existir (a menos que sejam anuláveis (lembre-se de que isso string
é anulável)), caso contrário, o AJAX ou POST irá falhar.
[HttpPost]
public ActionResult PostBack(int TrackingID, string FirstName, string IsLegal){
MyData.SaveRequest(TrackingID,FirstName, IsLegal == null ? false : true);
}
Você também pode postar de volta um modelo sem usar nenhum auxiliar de navalha. Eu descobri que isso é necessário algumas vezes.
public Class HomeModel
{
public int HouseNumber { get; set; }
public string StreetAddress { get; set; }
}
A marcação HTML será simplesmente ...
<input type="text" name="variableName.HouseNumber" id="whateverid" >
e seu controlador (Razor Engine) irá interceptar a variável de formulário "variableName" (o nome é como você quiser, mas mantenha-o consistente) e tentará construí-la e lançá-la em MyModel.
[HttpPost]
public ActionResult PostBack(HomeModel variableName){
postBack.HouseNumber; //The value user entered
postBack.StreetAddress; //the default value of NULL.
}
Quando um controlador está esperando um Model (neste caso, HomeModel) você não precisa definir TODOS os campos, pois o analisador apenas os deixará no padrão, geralmente NULL. O bom é que você pode misturar e combinar vários modelos no Mark-up e a análise posterior do post preencherá o máximo possível. Você não precisa definir um modelo na página ou usar nenhum auxiliar.
DICA: O nome do parâmetro no controlador é o nome definido na marcação HTML "name =" não o nome do modelo, mas o nome da variável esperada no!
O uso List<>
é um pouco mais complexo em sua marcação.
<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">
O índice na lista <> DEVE ser sempre baseado em zero e sequencial. 0,1,2,3.
[HttpPost]
public ActionResult PostBack(List<HomeModel> variableNameHere){
int counter = MyHomes.Count()
foreach(var home in MyHomes)
{ ... }
}
Uso IEnumerable<>
de postback de índices não baseados em zero e não sequenciais. Precisamos adicionar uma entrada extra oculta para ajudar o fichário.
<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 o código só precisa usar IEnumerable e chamar ToList()
[HttpPost]
public ActionResult PostBack(IEnumerable<MyModel> variableNameHere){
int counter = variableNameHere.ToList().Count()
foreach(var home in variableNameHere)
{ ... }
}
Recomenda-se o uso de um único Model ou ViewModel (Modelo contendo outros modelos para criar um modelo de 'Visualização' complexo) por página. Misturar e combinar como proposto pode ser considerado uma prática ruim, mas desde que funcione e seja legível, não é RUIM. No entanto, demonstra a potência e flexibilidade do motor Razor.
Portanto, se você precisar inserir algo arbitrário ou substituir outro valor de um auxiliar do Razor, ou simplesmente não quiser fazer seus próprios auxiliares, para um único formulário que usa alguma combinação incomum de dados, você pode usar rapidamente esses métodos para aceitar dados.