的答案是非常好的,但存在的MVC和最新发布的另一种方式。 NET,我真的很喜欢使用,而不是“老派”FormCollection和请求键。
考虑一个包含在表单标签中的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?" />
你的控制器实际上将解析表单数据,并尝试将它提供给你作为定义类型的参数。我包括复选框,因为它是一个棘手的问题。如果选中,则返回文本“on”;如果未选中,则返回null。需求虽然是这些已定义的变量必须存在(除非可为空(请记住,虽然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" >
和控制器(剃刀引擎)将拦截表单变量“是MyHome”,并尝试建立起来,并将其转换为为MyModel。
[HttpPost]
public ActionResult PostBack(MyModel MyHome){
postBack.HouseNumber; //The value user entered
postBack.StreetAddress; //the default value of NULL.
}
当一个控制器期望一个Model时,你不必定义所有的字段,因为解析器会将它们保留为默认值,通常为NULL。好的是你可以在Mark-up上混合和匹配各种模型,并且后期解析将尽可能地填充。您不需要在页面上定义模型或使用任何助手。
提示:控制器中参数的名称是在HTML标记“name =”中定义的名称 而不是Model的名称!
使用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">
列表上的索引<>必须始终为零,并且是连续的。 0,1,2,3。
[HttpPost]
public ActionResult PostBack(List<MyModel> MyHomes){
int counter = MyHomes.Count()
foreach(var home in MyHomes)
{ ... }
}
使用IEnumerable<>
基于非零和非循序索引后回来。我们需要添加一个额外的隐藏输入来帮助活页夹。
<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)
{ ... }
}
建议使用单一模型或视图模型(模型contianing其他模型来创建一个复杂的“查看'型号)每页。如所提出的混合和匹配可能被认为是不好的做法,但只要它有效并且可读性不坏。然而,它证明了剃刀引擎的强大和灵活性。因此,如果您需要放弃某项任意操作或覆盖Razor帮助程序中的其他值,或者不想自己制作帮助程序,对于使用一些不寻常的数据组合的单一表单,您可以快速使用这些接受额外数据的方法。
我只是想指出,你失去了编译器的备份选项2.如果模型更改,编译器将无法捕获相关控制器中的更改。方案2有很好的案例,但我不鼓励广泛使用。 – 2016-03-02 15:06:30
有时你需要丑陋的东西,当你已经知道最佳实践是什么时,有好的选择 – 2016-05-05 20:22:07
作为还在学习网点的人,为什么第二种方式更丑陋? – Goose 2017-01-12 18:16:31