Como recuperar valores de formulário de HTTPPOST, dictionary ou?

Eu tenho um controlador MVC que tem este método de ação:

[HttpPost] public ActionResult SubmitAction() { // Get Post Params Here ... return something ... } 

O formulário é um formulário não trivial com uma checkbox de texto simples.

Questão

Como eu access os valores dos parâmetros?

Eu não estou postando de um View, o post está vindo externamente. Estou assumindo que há uma coleção de pares chave / valor aos quais tenho access.

Eu tentei Request.Params.Get("simpleTextBox"); mas retorna erro “Desculpe, ocorreu um erro durante o processamento de sua solicitação”.

Você pode fazer com que a ação do controlador obtenha um object que reflita os nomes de input do formulário e o fichário de modelo padrão criará automaticamente esse object para você:

 [HttpPost] public ActionResult SubmitAction(SomeModel model) { var value1 = model.SimpleProp1; var value2 = model.SimpleProp2; var value3 = model.ComplexProp1.SimpleProp1; ... ... return something ... } 

Outra maneira (obviamente mais feia) é:

 [HttpPost] public ActionResult SubmitAction() { var value1 = Request["SimpleProp1"]; var value2 = Request["SimpleProp2"]; var value3 = Request["ComplexProp1.SimpleProp1"]; ... ... return something ... } 

Simplesmente, você pode usar FormCollection como:

 [HttpPost] public ActionResult SubmitAction(FormCollection collection) { // Get Post Params Here string var1 = collection["var1"]; } 

Você também pode usar uma class, que é mapeada com valores de formulário, e o mecanismo asp.net mvc a preenche automaticamente:

 //Defined in another file class MyForm { public string var1 { get; set; } } [HttpPost] public ActionResult SubmitAction(MyForm form) { string var1 = form1.Var1; } 

As respostas são muito boas, mas há outra maneira na versão mais recente do MVC e do .NET que realmente gosto de usar, em vez das chaves FormCollection e Request do “old school”.


Considere um snippet HTML contido em uma tag de formulário que faça um AJAX ou FORM POST.

   

Seu controlador irá realmente analisar os dados do formulário e tentar entregá-los a você como parâmetros do tipo definido. Eu incluí checkbox de seleção porque é um complicado. Ele retorna o texto “on” se marcado e null se não estiver marcado. O requisito, no entanto, é que essas variables ​​definidas DEVEM existir (a menos que seja anulável (lembre-se que essa string é anulável)) caso contrário, o AJAX ou POST back 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 razor. Eu percebi que isso é necessário algumas vezes.

 public Class MyModel { public int HouseNumber { get; set; } public string StreetAddress { get; set; } } 

A marcação HTML será simplesmente …

  

e seu controlador (Razor Engine) interceptará a variável de formulário “MyHome” e tentará construí-lo e convertê-lo em MyModel.

 [HttpPost] public ActionResult PostBack(MyModel MyHome){ postBack.HouseNumber; //The value user entered postBack.StreetAddress; //the default value of NULL. } 

Quando um controlador está esperando um Model, você não precisa definir TODOS os campos, pois o analisador os deixará no padrão, geralmente NULL. O bom é que você pode misturar e combinar vários modelos no Mark-up e o post back parse irá 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!


Usar List<> é um pouco mais complexo em sua marcação.

     

O índice na lista <> deve ser sempre baseado em zero e sequencial. 0,1,2,3.

 [HttpPost] public ActionResult PostBack(List MyHomes){ int counter = MyHomes.Count() foreach(var home in MyHomes) { ... } } 

Usando IEnumerable<> para índices não baseados em zero e não sequenciais, poste de volta. Precisamos adicionar uma input oculta extra para ajudar o fichário.

       

E o código só precisa usar IEnumerable e chamar ToList()

 [HttpPost] public ActionResult PostBack(IEnumerable MyHomes){ int counter = MyHomes.ToList().Count() foreach(var home in MyHomes) { ... } } 

Recomenda-se usar um único Modelo ou um ViewModel (Modelo que contém outros modelos para criar um Modelo de ‘Vista’ 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 o poder e a flexibilidade do motor do Razor.

Portanto, se você precisar inserir algo arbitrário ou replace outro valor de um auxiliar do Razor, ou simplesmente não desejar criar seus próprios ajudantes, para um único formulário que use uma combinação incomum de dados, você poderá usar esses methods rapidamente para aceitar dados.

Se você deseja obter os dados do formulário diretamente da solicitação Http, sem quaisquer ligações de modelo ou FormCollection você pode usar isto:

 [HttpPost] public ActionResult SubmitAction() { // This will return an string array of all keys in the form. // NOTE: you specify the keys in form by the name attributes eg: //  var keys = Request.Form.AllKeys; // This will return the value for the keys. var value1 = Request.Form.Get(keys[0]); var value2 = Request.Form.Get(keys[1]); }