编辑 Razor ASP MVC Core 中多个模型的布尔属性



我在最新的dotNet Core中有一个MVC项目。该模型具有布尔属性,我想使其在索引视图的模型列表中可编辑。

例如,如果我有一个这样的模型:

public class Model
{
public Guid ID {get; set;}
public bool Enabled {get; set;}
}

我正在尝试创建一个列表,用户只能在其中更新已启用属性

@model IEnumerable<Model>
@{
ViewData["Title"] = "Index";
}
<table class="table">
<thead>
<tr>
<th>
@Html.DisplayNameFor(model => model.Id)
</th>
<th>
@Html.DisplayNameFor(model => model.Enabled)
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) 
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Id)
</td>
<td>
@Html.EditorFor(modelItem => item.Enabled)
</td>
}
</tbody>
</table>

用户更新所有复选框后,我可以使用这样的按钮

<input type="submit" value="Save" class="btn btn-default" asp-action="UpdateEnabled" />

然后控制器中的方法应该获取列表并更新数据库

public async Task UpdateEnabled([Bind("Id,Enabled")] List<Model> models)
{
var allDbModels = context.Models.ToList();
foreach (Model modelFromView in models)
{
var dbModel = allDbModels.First(dbm => dbm.Id == modelFromView.Id);
dbModel.Enabled = modelFromView.Enabled;
}
await context.SaveChangesAsync();
}

我是MVC的新手,我不知道最好的方法是什么。在前面的代码中,控制器永远不会被调用。

我怎样才能让它工作?在 MVC 中执行此操作的最佳方法是什么? 谢谢!

我建议您更改要发送的数据。无需发送包含 ID 以及是否启用的所有Model对象的列表,只需发送已启用 ID 的列表。你可以这样做:

@model UpdateEnabledViewModel
<form asp-action="UpdateEnabled" method="post">
<ul>
@foreach (var item in Model.AvailableItems)
{
<li><label><input type="checkbox" name="SelectedItems[]" value="@item.Id" /> @item.Id</label></li>
}
</ul>
<button type="submit">Submit</button>
</form>

然后,SelectedModel[]名称允许您在发布到操作的模型中检索这些值的数组:

public class HomeController : Controller
{
// example data to have the same ids between requests
private static readonly Guid[] ids = Enumerable.Range(0, 10).Select(_ => Guid.NewGuid()).ToArray();
[HttpGet]
public IActionResult UpdateEnabled()
{
// create view model, with the available items that can be selected
var model = new UpdateEnabledViewModel
{
AvailableItems = ids.Select(id => new Model { Id = id }).ToArray(),
};
return View(model);
}
[HttpPost]
public IActionResult UpdateEnabled(UpdateEnabledViewModel model)
{
return Json(model.SelectedItems);
}
}
public class UpdateEnabledViewModel
{
public Guid[] SelectedItems { get; set; }
public Model[] AvailableItems { get; set; }
}
public class Model
{
public Guid Id { get; set; }
}

然后,这将仅传输选定的 id,而不是传输所有带有布尔值的 id,无论它们是否被选中。因此,您可以节省流量,同时使一切变得更容易。这也将允许您在Model中包含更多属性,例如,对于一个Label,然后显示在复选框旁边。

最新更新