如何从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]); }
- dynamic添加DropDownlists不会触发SelectedIndexChanged事件
- 在控制器.NET MVC中创build一个URL
- “无法加载types .Global”导致我悲伤
- DropdownList数据源
- 如何在ASP.Net中发送状态码500并仍写入响应?
- “System.Data.Entity.Internal.AppConfig”的types初始值设定项引发exception
- ASP.NET IIS Web.config
- ASP.NET_SessionId + OWIN Cookies不发送给浏览器
- 我可以在Visual Studio 2008中开发.NET Framework 4吗?