使用@HTML.editor 生成SelectListItem 复选框?
Using @HTML.editor to generate SelectListItem checkboxes?
我是 ASP.NET MVC 的超级新手。我太新了,我仍然不善于措辞我的问题...我希望我能对此有所了解...
基本上,我想要的是一个复选框列表,其中包含数据库中的家具项目列表 table。 table 当前有 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() {}
}
}
和控制器(是的,它叫做 Furnitures。我应该解决这个问题。):
public IActionResult Delivery()
{
List<Furniture> furniture = context.Furnitures.ToList();
return View("Index", new DeliveryViewModel(furniture));
}
基本上,当我启动应用程序时,我得到的不是类似家具清单的任何东西,而是 table 中的每一项看起来像 "FalseFalseFalseFalseFalseFalse" 的东西。一开始我只是想得到一个下拉列表,但我什至无法得到它。
如果可以的话,我想继续使用 View 代码,因为我有多个表单使用该代码并且工作正常。那可能吗?似乎很多复选框列表的解决方案都涉及 @HTML.checkboxfor 或其某些变体,这会影响我重用此视图的能力。我在 ViewModel 中还有很多属性,我怀疑我在处理这个项目时需要做很多更改,因此为此制作一个特殊的表格会很烦人。
我说的有道理吗?我能得到帮助吗?
如果解决 "how do I build a list of items with checkboxes" 是您问题的核心关注点,那么上手起来就比较简单了。
我会为每个 "checkbox item":
定义一个视图模型
public class CheckBoxItem
{
public int ID { get; set; }
public string Name { get; set; }
public bool IsChecked { get; set; }
}
SelectListItem 几乎相同,除了值 属性 是一个字符串 - 我建议的 CheckBoxItem class 让您可以直接使用它进行数据库查找(假设您的行 ID 是整数)。
在ASP.NET MVC框架中,如果你有一个与class同名的视图,你可以使用HtmlHelper.EditorFor方法自动拥有那个视图select编辑和渲染,像这样:
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 到 select 所有为真的项目)以查看哪些项目被选中 - 复选框助手将为 true 和 false 构建输入,其中仅当复选框被选中时才提交 true 值。
我是 ASP.NET MVC 的超级新手。我太新了,我仍然不善于措辞我的问题...我希望我能对此有所了解...
基本上,我想要的是一个复选框列表,其中包含数据库中的家具项目列表 table。 table 当前有 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() {}
}
}
和控制器(是的,它叫做 Furnitures。我应该解决这个问题。):
public IActionResult Delivery()
{
List<Furniture> furniture = context.Furnitures.ToList();
return View("Index", new DeliveryViewModel(furniture));
}
基本上,当我启动应用程序时,我得到的不是类似家具清单的任何东西,而是 table 中的每一项看起来像 "FalseFalseFalseFalseFalseFalse" 的东西。一开始我只是想得到一个下拉列表,但我什至无法得到它。
如果可以的话,我想继续使用 View 代码,因为我有多个表单使用该代码并且工作正常。那可能吗?似乎很多复选框列表的解决方案都涉及 @HTML.checkboxfor 或其某些变体,这会影响我重用此视图的能力。我在 ViewModel 中还有很多属性,我怀疑我在处理这个项目时需要做很多更改,因此为此制作一个特殊的表格会很烦人。
我说的有道理吗?我能得到帮助吗?
如果解决 "how do I build a list of items with checkboxes" 是您问题的核心关注点,那么上手起来就比较简单了。
我会为每个 "checkbox item":
定义一个视图模型public class CheckBoxItem
{
public int ID { get; set; }
public string Name { get; set; }
public bool IsChecked { get; set; }
}
SelectListItem 几乎相同,除了值 属性 是一个字符串 - 我建议的 CheckBoxItem class 让您可以直接使用它进行数据库查找(假设您的行 ID 是整数)。
在ASP.NET MVC框架中,如果你有一个与class同名的视图,你可以使用HtmlHelper.EditorFor方法自动拥有那个视图select编辑和渲染,像这样:
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 到 select 所有为真的项目)以查看哪些项目被选中 - 复选框助手将为 true 和 false 构建输入,其中仅当复选框被选中时才提交 true 值。