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

C# 使用@HTML.editor生成SelectListItem复选框?,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我是ASP.NETMVC的新手。我是如此的新,我仍然不善于措辞我的问题…我希望我能有一些道理与此 基本上,我想要的是一个复选框列表,其中包含一个数据库表中的家具项目列表。该表目前有20个项目;列是ID和Name 我有多个表单,因此我一直在视图中使用: <form method="post"> @foreach (var property in ViewData.ModelMetadata.Properties) { <div class="form-group">

我是ASP.NETMVC的新手。我是如此的新,我仍然不善于措辞我的问题…我希望我能有一些道理与此

基本上,我想要的是一个复选框列表,其中包含一个数据库表中的家具项目列表。该表目前有20个项目;列是ID和Name

我有多个表单,因此我一直在视图中使用:

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

@foreach(ViewData.ModelMetadata.Properties中的var属性)
{
@(property.DisplayName??property.PropertyName)
@编辑器(property.PropertyName)
@ValidationMessage(property.PropertyName,新的{@class=“help block”})
}
对于此特定表单,我在ViewModel中使用此代码(还有其他属性):

公共列表家具{get;set;}
公共交付视图模型(IEnumerable家具)
{
家具=新列表();
foreach(家具中的家具件)
{
家具。添加(新SelectListItem)
{
值=工件ID.ToString(),
Text=件。名称
});
}
}
公共交付视图模型(){}
}
}
还有控制器(是的,它叫家具。我应该修理一下。):

public IActionResult Delivery()
{
List furniture=context.Furnitures.ToList();
返回视图(“索引”,新DeliveryViewModel(家具));
}
基本上,当我启动应用程序时,我得到的不是类似于家具清单的东西,而是表中每个项目的“FalseFalse”。一开始我只是想得到一个下拉列表,但我甚至不能得到

如果可以的话,我想继续使用视图代码,因为我有多个表单使用该代码并且工作正常。可能吗?似乎很多复选框列表的解决方案都涉及@HTML.checkboxfor或其变体,这会影响我重用此视图的能力。我在ViewModel中还有很多属性,我怀疑我在处理这个项目时需要做很多更改,所以为此制作一个特殊的表单会很烦人

我说得通吗?我能得到帮助吗

如果您的问题的核心关注点是“如何使用复选框构建项目列表”,那么这一点从一开始就有点简单

我将为每个“复选框项”定义一个视图模型:

公共类CheckBoxItem
{
公共int ID{get;set;}
公共字符串名称{get;set;}
已检查公共布尔值{get;set;}
}
SelectListItem几乎相同,只是Value属性是一个字符串——我建议的CheckBoxItem类允许您直接使用它进行数据库查找(假设您的行ID是整数)

在ASP.NET MVC framework中,如果有与类同名的视图,则可以使用该方法自动选择并呈现该视图,如下所示:

CheckBoxItem.cshtml
@model full.Qualified.Namespace.CheckBoxItem

你需要放弃这一点——你正在尝试的东西永远不会起作用,也永远不会正确绑定。我有一种感觉,情况就是这样。好吧。值得一试。
    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));
    }
@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>