答案非常好,但在最新版本的 MVC 和 .NET 中还有另一种我非常喜欢使用的方法,而不是“老派”的 FormCollection 和 Request 键。
考虑一个包含在执行 AJAX 或 FORM POST 的表单标记中的 HTML sn-p。
<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 HomeModel
{
public int HouseNumber { get; set; }
public string StreetAddress { get; set; }
}
HTML 标记将只是 ...
<input type="text" name="variableName.HouseNumber" id="whateverid" >
并且您的控制器(Razor 引擎)将拦截表单变量“variableName”(名称如您所愿,但保持一致)并尝试构建它并将其转换为 MyModel。
[HttpPost]
public ActionResult PostBack(HomeModel variableName){
postBack.HouseNumber; //The value user entered
postBack.StreetAddress; //the default value of NULL.
}
当控制器需要一个模型(在本例中为 HomeModel)时,您不必定义所有字段,因为解析器只会将它们保留为默认值,通常为 NULL。好消息是您可以在标记上混合和匹配各种模型,并且后回解析将尽可能多地填充。您不需要在页面上定义模型或使用任何帮助程序。
TIP:控制器中参数的名称就是定义的名称
在 HTML 标记中,“name=”不是模型的名称,而是 !
中预期变量的名称
使用List<> 的标记要复杂一些。
<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">
列表上的索引 必须始终从零开始且连续。 0,1,2,3。
[HttpPost]
public ActionResult PostBack(List<HomeModel> variableNameHere){
int counter = MyHomes.Count()
foreach(var home in MyHomes)
{ ... }
}
将IEnumerable<> 用于非零基和非顺序索引回发。我们需要添加一个额外的隐藏输入来帮助活页夹。
<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">
而代码只需要使用IEnumerable并调用ToList()
[HttpPost]
public ActionResult PostBack(IEnumerable<MyModel> variableNameHere){
int counter = variableNameHere.ToList().Count()
foreach(var home in variableNameHere)
{ ... }
}
建议每页使用单个模型或视图模型(模型包含其他模型以创建复杂的“视图”模型)。提议的混合和匹配可能被认为是不好的做法,但只要它有效且可读,它就不是坏事。然而,它确实展示了 Razor 引擎的强大功能和灵活性。
因此,如果您需要从 Razor 助手中添加任意内容或覆盖另一个值,或者只是不想制作自己的助手,对于使用一些不寻常的数据组合的单个表单,您可以快速使用这些方法接受额外的数据。