与 ASP.NET 核心的模型绑定
Model Binding with ASP.NET Core
我正在尝试使用 asp.net 核心 MVC 制作一个简单的待办事项 MVC 应用程序。我的计划是制作一个带有简单复选框的网页,并让用户能够使用表单更改状态。
表单显示正确,但控制器中的 "model binding" 不起作用。
我做错了什么?
The UI (image)
观点:
@model List<Todo>
<form asp-controller="Home" asp-action="ModifyTodo" method="post">
<ul class="mdc-list">
@for (var i = 0; i < Model.Count; i++)
{
<li class="mdc-list-item">
<input asp-for="@Model[i].Status" name="todos[@i].Status" >
<input asp-for="@Model[i].Id" name="todos[@i].Id" value="@Model[i].Id" type="hidden">
<input asp-for="@Model[i].Text" name="todos[@i].Text" value="@Model[i].Text" type="hidden">
<label> @Model[i].Text</label>
</li>
}
</ul>
<input type="submit" value="submit">
</form>
我的控制器:
public class HomeController : Controller
{
public IActionResult Index()
{
return GiveTodoView();
}
[HttpPost]
public IActionResult ModifyTodo([FromForm] List<Todo> todos)
{
// Console.WriteLine(test);
var temp = "Count: "+todos.Count;
foreach (var todo in todos)
{
temp += todo.Status + " " + todo.Text + " <br />";
}
return Content(temp);
// return GiveTodoView();
}
private IActionResult GiveTodoView()
{
var manager = TodoManager.GetTotalManager();
return View("Index", manager.GetTodos().ToList());
}
}
Todo.cs
public class Todo
{
public int Id;
public bool Status;
public string Text;
}
如何在控制器的操作中从表单中获取所有待办事项 ModifyTodo
?
提前致谢!
编辑
Razor 生成的html。我去掉了不必要的标记
<form method="post" action="/Home/ModifyTodo">
<ul class="mdc-list">
<li class="mdc-list-item">
<input name="todos[0].Status" type="checkbox" checked="checked" data-val="true" data-val-required="The Boolean field is required." id="z0__Status" value="true">
<input name="todos[0].Id" value="0" type="hidden" data-val="true" data-val-required="The Int32 field is required." id="z0__Id">
<input name="todos[0].Text" value="First test" type="hidden" id="z0__Text">
<label>First test</label></li>
<li class="mdc-list-item">
<input name="todos[1].Status" type="checkbox" data-val="true" data-val-required="The Boolean field is required." id="z1__Status" value="true">
<input name="todos[1].Id" value="0" type="hidden" data-val="true" data-val-required="The Int32 field is required." id="z1__Id">
<input name="todos[1].Text" value="second test" type="hidden" id="z1__Text">
<label>second test</label></li>
</ul>
</div>
<input name="__RequestVerificationToken" type="hidden" value="CfDJ8GAD8c4qIkNEktrZwHPVewBTkkBNZ7RlAVcu7N2_sgbMy2O3FSRi_x5Nw1WNlXWqBhz_wNdeBYCj9oqnopS4fZxDgvjC5FGeCQ2jS3tS7IdXgwyAxPe6BnDhmOJDcK9fmqBdV8BcTC8qxrZEouj4RMU" />
<input name="[0].Status" type="hidden" value="false">
<input name="[1].Status" type="hidden" value="false">
</form>
您在 asp-for
值前加上了 @
。这将导致 Razor 实际获取 属性 的值并将其放在那里。那不是你想要的。相反,您的标签助手的格式应为:
<input asp-for="[i].Status">
由于 todos
是您要绑定的根对象的名称,因此您不需要在输入中输入它的名称
<input asp-for="@Model[i].Status" name="[@i].Status" >
您还需要将这些从 public 字段更改为 public 属性
public class Todo
{
public int Id { get; set; }
public bool Status { get; set; }
public string Text { get; set; }
}
我正在尝试使用 asp.net 核心 MVC 制作一个简单的待办事项 MVC 应用程序。我的计划是制作一个带有简单复选框的网页,并让用户能够使用表单更改状态。 表单显示正确,但控制器中的 "model binding" 不起作用。
我做错了什么?
The UI (image)
观点:
@model List<Todo>
<form asp-controller="Home" asp-action="ModifyTodo" method="post">
<ul class="mdc-list">
@for (var i = 0; i < Model.Count; i++)
{
<li class="mdc-list-item">
<input asp-for="@Model[i].Status" name="todos[@i].Status" >
<input asp-for="@Model[i].Id" name="todos[@i].Id" value="@Model[i].Id" type="hidden">
<input asp-for="@Model[i].Text" name="todos[@i].Text" value="@Model[i].Text" type="hidden">
<label> @Model[i].Text</label>
</li>
}
</ul>
<input type="submit" value="submit">
</form>
我的控制器:
public class HomeController : Controller
{
public IActionResult Index()
{
return GiveTodoView();
}
[HttpPost]
public IActionResult ModifyTodo([FromForm] List<Todo> todos)
{
// Console.WriteLine(test);
var temp = "Count: "+todos.Count;
foreach (var todo in todos)
{
temp += todo.Status + " " + todo.Text + " <br />";
}
return Content(temp);
// return GiveTodoView();
}
private IActionResult GiveTodoView()
{
var manager = TodoManager.GetTotalManager();
return View("Index", manager.GetTodos().ToList());
}
}
Todo.cs
public class Todo
{
public int Id;
public bool Status;
public string Text;
}
如何在控制器的操作中从表单中获取所有待办事项 ModifyTodo
?
提前致谢!
编辑
Razor 生成的html。我去掉了不必要的标记
<form method="post" action="/Home/ModifyTodo">
<ul class="mdc-list">
<li class="mdc-list-item">
<input name="todos[0].Status" type="checkbox" checked="checked" data-val="true" data-val-required="The Boolean field is required." id="z0__Status" value="true">
<input name="todos[0].Id" value="0" type="hidden" data-val="true" data-val-required="The Int32 field is required." id="z0__Id">
<input name="todos[0].Text" value="First test" type="hidden" id="z0__Text">
<label>First test</label></li>
<li class="mdc-list-item">
<input name="todos[1].Status" type="checkbox" data-val="true" data-val-required="The Boolean field is required." id="z1__Status" value="true">
<input name="todos[1].Id" value="0" type="hidden" data-val="true" data-val-required="The Int32 field is required." id="z1__Id">
<input name="todos[1].Text" value="second test" type="hidden" id="z1__Text">
<label>second test</label></li>
</ul>
</div>
<input name="__RequestVerificationToken" type="hidden" value="CfDJ8GAD8c4qIkNEktrZwHPVewBTkkBNZ7RlAVcu7N2_sgbMy2O3FSRi_x5Nw1WNlXWqBhz_wNdeBYCj9oqnopS4fZxDgvjC5FGeCQ2jS3tS7IdXgwyAxPe6BnDhmOJDcK9fmqBdV8BcTC8qxrZEouj4RMU" />
<input name="[0].Status" type="hidden" value="false">
<input name="[1].Status" type="hidden" value="false">
</form>
您在 asp-for
值前加上了 @
。这将导致 Razor 实际获取 属性 的值并将其放在那里。那不是你想要的。相反,您的标签助手的格式应为:
<input asp-for="[i].Status">
由于 todos
是您要绑定的根对象的名称,因此您不需要在输入中输入它的名称
<input asp-for="@Model[i].Status" name="[@i].Status" >
您还需要将这些从 public 字段更改为 public 属性
public class Todo
{
public int Id { get; set; }
public bool Status { get; set; }
public string Text { get; set; }
}