[英]ASP.NET MVC - Controller receives the list incorret from view using Html.BeginForm()
I want to get multiple instances of my model objects sent to the controller as a list but for some reason, the count of the list is always 1 and the value of the object is always 0 so nothing is actually posted when submit is pressed.我想将模型对象的多个实例作为列表发送到控制器,但由于某种原因,列表的计数始终为 1,对象的值始终为 0,因此按下提交时实际上没有发布任何内容。
This is my View:这是我的观点:
@model List<MVCModel.Models.Student>
<b>Items</b> @ViewBag.Items <br />
<b>Value</b> @ViewBag.Value <br />
@using (Html.BeginForm("Form", "Home", FormMethod.Post))
{
<table>
<tbody id="GenaratorList">
<tr>
@{
int counter = 0;
<td>Enter Name: </td>
<td>@Html.TextBoxFor(m => m[counter].Name, new {id = "Name"})</td>
<td>Enter Age: </td>
<td>@Html.TextBoxFor(m => m[counter].Age, new {id = "Age"})</td>
<td><input type="button" value="Add" onclick="addGenarator()" /></td>
</tr>
counter++;
}
<tbody>
</table>
<input type="submit" value="Submit Form"/>
}
<script>
count = 0;
function addGenarator() {
var Name = $('#Name').val();
var Age = $('#Age').val();
var Student = "studentModels[" + count + "]";
$('#GenaratorList').append('<tr><td><input id="' + Student + '.Name" Name="' + Student + '.Name" type="text" class="form-control" readonly value="' + Name + '"></td><td><input id="' + Student + '.Age" Age="' + Student + '.Age" type="text" class="form-control" readonly value="' + Age + '"></td></tr>');
$('#Name,#Age').val('');
count++;
}
</script>
This is my Controller:这是我的控制器:
[HttpPost]
public ActionResult Form(List<Student> s)
{
ViewBag.Items = s.Count; // ALWAYS RETURNS 1
ViewBad.Value = s[0].Age // TEST VALUE OF FIRST ITEM RETURNS 0
return View("Index");
}
This is my model:这是我的模型:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MVCModel.Models
{
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
}
Your Form
(HttpPost) API was expected to receive a request body with an array named s
.您的
Form
(HttpPost) API 应该会收到一个请求正文,其中包含一个名为s
的数组。 You will pass the array as (name) studentModels
based on your JS code.您将根据您的 JS 代码将数组作为(名称)
studentModels
传递。
var Student = "studentModels[" + count + "]";
And you miss out on the name attribute for each Age input.而且您错过了每个 Age 输入的 name 属性。
<input id="' + Student + '.Age" Age="' + Student + '.Age" type="text" class="form-control" readonly value="' + Age + '">
To fix, make sure the array name in View must be matched with the Controller parameter name.要解决此问题,请确保 View 中的数组名称必须与 Controller 参数名称匹配。 For the below code, I name the array as
s
which is the same as the Controller API expected parameter name.对于下面的代码,我将数组命名为
s
,这与 Controller API 预期的参数名称相同。
Also, apply with template literals and string interpolation to make the HTML string looks clean and easier to bind the values with variables.此外,应用模板文字和字符串插值以使 HTML 字符串看起来干净,并且更容易将值与变量绑定。
function addGenarator() {
var Name = $('#Name').val();
var Age = $('#Age').val();
var Student = "s[" + count + "]";
var html = `
<tr>
<td><input id="${Student}.Name" name="${Student}.Name" type="text" class="form-control" readonly value="${Name}" /></td>
<td><input id="${Student}.Age" name="${Student}.Age" type="text" class="form-control" readonly value="${Age}" /></td>
</tr>
`;
$('#GenaratorList').append(html);
$('#Name,#Age').val('');
count++;
}
Submitted form & Request Form
提交表格和申请表格
Debugging Output
调试输出
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.