使用@ HTML.editor生成SelectListItem复选框?

时间:2018-04-12 01:15:52

标签: c# asp.net-mvc asp.net-mvc-4

我是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中也有很多属性,并怀疑我在处理这个项目时需要做很多更改,所以为此制作一个特殊的表单会很烦人。

我有道理吗?我可以得到帮助吗?

1 个答案:

答案 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方法自动选择并呈现该视图,如下所示:

CheckBoxItem.cshtml

@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>

然后,假设这是您的父视图:

Furniture.cshtml

@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值。