我正在制作一个视图,其中显示了类(Machine
)的所有记录,其中可以更新其某些属性。
为此,视图正在使用IEnumerable。这些是Get和Post方法:
获取:
public async Task<IActionResult> Test()
{
PopulateMachineTypeDropDownListStore();
return View(await _context.Machines.AsNoTracking().ToListAsync());
}
发表:
[HttpPost, ActionName("Test")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> TestPost(int id, [Bind("Id,StoreID,PUnit,Status")] Machine machine)
{
if (id != machine.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(machine);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!MachineExists(machine.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction("Index");
}
return View(machine);}
问题是发送到Post Action的类是null(几乎所有字段都是零或null除了Id)
public async Task<IActionResult> TestPost(int id, [Bind("Id,StoreID,PUnit,Status")] Machine machine)
问题:所以,我不知道如何纠正这个问题。视图中是否会缺少某些内容?
@model IEnumerable<Application.Models.Machine>
@{
ViewData["Title"] = "Test";
}
@foreach (var item in Model)
{
<form asp-action="Test" asp-route-id="@item.Id" method="post">
<table class="table">
<tbody>
<tr>
<td>
<input type="hidden" asp-for="@item.Id" />
<div class="form-group">
<div class="col-md-10">
<input asp-for="@item.MchName" readonly class="form-control" />
<span asp-validation-for="@item.MchName" class="text-danger"></span>
</div>
</div>
</td>
<td>
<div class="form-group">
<div class="col-md-10">
<select asp-for="@item.StoreID" class="form-control" asp-items="ViewBag.StoreID">
</select>
<span asp-validation-for="@item.StoreID" class="text-danger"></span>
</div>
</div>
</td>
<td>
<div class="form-group">
<div class="col-md-10">
<input type="number" max="10" step=".1" asp-for="@item.PUnit" class="form-control" />
<span asp-validation-for="@item.PUnit" class="text-danger"></span>
</div>
</div>
</td>
<td>
<div class="form-group">
<div class="col-md-10">
<select name="Status" asp-for="@item.Status" class="form-control">
<option value="0">Operativo</option>
<option value="1">Nuevo Item</option>
<option value="2">Reparación</option>
</select>
<span asp-validation-for="@item.Status" class="text-danger"></span>
</div>
</div>
</td>
<td>
<input id="submit-data" type="submit" value="Update" class="btn btn-default" />
</td>
</tr>
</tbody>
</table>
</form>}
提前致谢
答案 0 :(得分:1)
由于ModelBinder使用绑定的命名约定,请尝试将machine
方法的TestPost()
参数重命名为item
。
public async Task<IActionResult> TestPost(
int id, [Bind("Id, StoreID, PUnit,Status")] Machine item)
{
//...
}
或者,在您的视图中,您可以将item
变量重命名为machine
,以使其与预期的参数名称匹配:
@foreach (var machine in Model)
{ ... }
docs概括地描述了这个:
模型绑定查找模式parameter_name.property_name以将值绑定到属性
最后,在“状态”下拉列表中省略name
属性,这会阻碍模型绑定。让asp-for
完成工作:
<select asp-for="@item.Status" class="form-control">
我真的不知道你如何填写商店下拉列表,但至少应该看到PUnit
和Status
属性以这种方式填充。