我是ASP.NET MVC的新手。我很新,我仍然不善于措辞我的问题...我希望我能对此有所了解......
基本上,我想要的是一个复选框列表,其中包含数据库表中的家具项列表。该表目前有20个项目;列是ID和名称。
我有多种形式,所以我一直在视图中使用它:
<form method="post">
@foreach (var property in ViewData.ModelMetadata.Properties)
{
<div class="form-group">
<label asp-for="@property.PropertyName">
@(property.DisplayName ?? property.PropertyName)
</label>
@Html.Editor(property.PropertyName)
@Html.ValidationMessage(property.PropertyName, new { @class = "help-block" })
</div>
}
<input type="submit" value="@ViewBag.Button" />
</form>
对于这个特定的表单,我在ViewModel中使用此代码(还有其他属性):
public List<SelectListItem> Furniture { get; set; }
public DeliveryViewModel(IEnumerable<Furniture> furniture)
{
Furniture = new List<SelectListItem>();
foreach (Furniture piece in furniture)
{
Furniture.Add(new SelectListItem
{
Value = piece.ID.ToString(),
Text = piece.Name
});
}
}
public DeliveryViewModel() {}
}
}
和控制器(是的,它叫做家具。我应该解决这个问题。):
public IActionResult Delivery()
{
List<Furniture> furniture = context.Furnitures.ToList();
return View("Index", new DeliveryViewModel(furniture));
}
基本上,当我启动应用程序时,而不是获得类似于家具列表的任何内容,我会为表中的每个项目获得类似“FalseFalseFalseFalseFalseFalse”的内容。我刚开始尝试下拉,但我甚至无法得到。
如果可以的话,我想继续使用View代码,因为我有多个使用该代码并且工作正常的表单。那可能吗?似乎许多复选框列表的解决方案涉及@ HTML.checkboxfor或其中的一些变体,这会影响我能够重用此View。我在ViewModel中也有很多属性,并怀疑我在处理这个项目时需要做很多更改,所以为此制作一个特殊的表单会很烦人。
我有道理吗?我可以得到帮助吗?
答案 0 :(得分:1)
如果解决“如何使用复选框构建项目列表”是您的问题的核心问题,那么开始这一点很简单。
我会为每个“复选框项目”定义一个视图模型:
public class CheckBoxItem
{
public int ID { get; set; }
public string Name { get; set; }
public bool IsChecked { get; set; }
}
SelectListItem几乎相同,除了Value属性是一个字符串 - 我建议的CheckBoxItem类允许你直接使用它来进行数据库查找(假设你的行ID是整数)。
在ASP.NET MVC框架中,如果您有一个与类同名的视图,则可以使用HtmlHelper.EditorFor方法自动选择并呈现该视图,如下所示:
@model Fully.Qualified.Namespace.CheckBoxItem
<div class="checkbox-list-item>
<div class="form-check">
<label class="form-check-label">
@Html.CheckBoxFor(m => m.IsChecked, new { @class="form-check-input" })
@Model.Name
</label
</div>
@Html.HiddenFor(m => m.ID)
@Html.HiddenFor(m => m.Name)
</div>
然后,假设这是您的父视图:
@model Fully.Qualified.Namespace.FurnitureListModel
<div class="checkbox-list">
@Html.EditorFor(m => m.Items)
</div>
以此为模型:
public class FurnitureListModel
{
public ICollection<CheckBoxItem> Items { get; set; }
}
EditorFor
助手会自动遍历集合属性Items
,呈现每个项目的视图。
提交表单时,您将检查每个项目的IsChecked
属性(或使用LINQ选择所有项目都是真的)以查看哪些项目已被选中 - 复选框助手将构建输入true和false,只有选中复选框才会提交true值。