如何从HTTPPOST,字典或?

我有一个MVC控制器有这个操作方法:

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

该表单是一个简单的文本框不平凡的forms。

我如何访问参数值?

我不是从一个View发帖,这个post是来自外部的。 我假设有一个我有权访问的键/值对的集合。

我试过Request.Params.Get("simpleTextBox"); 但它返回错误“对不起,处理您的请求时发生错误”。

您可以让您的控制器操作采取反映表单input名称的对象,默认模型联编程序会自动为您创build此对象:

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

另一种(显然更丑陋)的方式是:

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

简单地说,你可以使用FormCollection

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

你也可以使用一个与Form值映射的类,而asp.net mvc引擎会自动填充它:

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

答案是非常好的,但是我真的很喜欢使用MVC和.NET的最新版本,而不是“老派”的FormCollection和Request键。


考虑包含在表单标签中的HTML代码片段,它可以执行AJAX或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?" /> 

您的控制器将实际分析表单数据,并尝试将其作为定义types的参数传送给您。 我包括checkbox,因为这是一个棘手的问题。 如果选中,则返回文本“on”,否则返回null。 要求虽然是这些定义的variables必须存在(除非可空(记住,虽然该string是可空的)),否则AJAX或POST返回将失败。

 [HttpPost] public ActionResult PostBack(int TrackingID, string FirstName, string IsLegal){ MyData.SaveRequest(TrackingID,FirstName, IsLegal == null ? false : true); } 

您也可以回发一个模型,而不使用任何剃刀助手。 我遇到过,这是需要一些时间。

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

HTML标记将只是…

 <input type="text" name="MyHome.HouseNumber" id="whateverid" > 

和您的控制器(Razor引擎)将拦截表单variables“MyHome”,并尝试build立它并将其投射到MyModel。

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

当一个控制器期待一个Model时,你不必定义所有的字段,因为parsing器会将它们保留为默认值,通常为NULL。 好的是,你可以在Mark-up上混合搭配各种模型,并且后期parsing会尽可能地填充。 您不需要在页面上定义模型或使用任何助手。

提示:控制器中参数的名称是在HTML标记“name =”中定义的名称,而不是模型的名称!


使用List<>在标记中更复杂一些。

 <input type="text" name="MyHomes[0].HouseNumber" id="id" value="0"> <input type="text" name="MyHomes[1].HouseNumber" id="whateverid-x" value="1"> <input type="text" name="MyHomes[2].HouseNumber" value="2"> <input type="text" name="MyHomes[3].HouseNumber" id="whateverid22" value="3"> 

List <>上的索引必须始终为零,并且是连续的。 0,1,2,3。

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

使用IEnumerable<>对于非零基和非连续索引进行回发。 我们需要添加一个额外的隐藏input来帮助活页夹。

 <input type="hidden" name="MyHomes.Index" value="278"> <input type="text" name="MyHomes[278].HouseNumber" id="id" value="3"> <input type="hidden" name="MyHomes.Index" value="99976"> <input type="text" name="MyHomes[99976].HouseNumber" id="id3" value="4"> <input type="hidden" name="MyHomes.Index" value="777"> <input type="text" name="MyHomes[777].HouseNumber" id="id23" value="5"> 

而代码只需要使用IEnumerable并调用ToList()

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

build议每个页面使用一个模型或一个ViewModel(模型连同其他模型来创build一个复杂的“视图”模型)。 所提出的混合和匹配可能被认为是不好的做法,但是只要它能够工作,并且可以阅读它就不会坏。 然而,它certificate了剃刀引擎的强大和灵活性。

所以,如果你需要放弃任何东西,或者重写Razor帮助器的另一个值,或者不想自己制作帮助器,对于使用一些不寻常的数据组合的单一表单,可以快速使用这些方法来接受额外的数据。

如果你想直接从Http请求获取表单数据,而没有任何模型绑定或FormCollection你可以使用这个:

 [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: // <input name="this is the key" value="some value" type="test" /> 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]); }