如何为 ASP.NET Core 制作精美的复选框模板?

How can I make a fancy checkbox template for ASP.NET Core?

我的模型中有很多 boolean,我们正在使用 Bootstrap,所以对于每个布尔值 属性,我是 copy/paste重构:

<div class="form-group">
    <div class="custom-control custom-checkbox ">
        <input asp-for="IsFoo"/>
        <label asp-for="IsFoo"></label>
    </div>
</div>

...但这很愚蠢。我尝试将其添加到 Views/Shared/EditorTemplates/bool.cshtml:

@model bool?
<div class="form-group">
    <div class="custom-control custom-checkbox ">
        <input asp-for="@Model"/>
        <label asp-for="@ViewData.TemplateInfo.FormattedModelValue"></label>
    </div>
</div>

... 并用 @Html.EditorFor(m => m.IsFoo) 调用它,但我得到的只是来自默认模板的普通 input 元素。

  1. 我做错了什么 给模板命名'boolean.cshtml'
  2. ViewData.TemplateInfo.FormattedValue 从 属性 中获取 Display(Name="xxx") 属性的正确值。 ViewData.ModelMetadata.DisplayName
  3. 在 ASP.NET Core 中是否有一些新的和改进的版本而不是我应该使用的编辑器模板(比如 Tag Helpers?)而不是 "old" 方式,如果是这样,怎么办我去做?

使用 <partial> 标签助手:

<partial name="MyCheckbox" for="IsFoo" />

它也适用于绑定属性:

class MyModel
{
    public List<MyCheckboxModel> MyCheckboxList { get; set; }
}

class MyCheckboxModel
{
    public Boolean IsChecked { get; set; }
}

@for( Int32 i = 0; i < this.Model.MyCheckboxList.Count; i++ )
{
    <partial name="MyCheckbox" for="MyCheckboxList[i]"
}

将您的局部视图更改为:

@model MyCheckboxModel
<div class="form-group">
    <div class="custom-control custom-checkbox">
        <input asp-for="@Model"/>
        <label asp-for="@Model"></label>
    </div>
</div>

for="" 属性导致部分中的 name/id/binding 上下文与命名的 属性 匹配,因此 ASP.NET 将施展魔法以确保 <input asp-for="@Model" />会对应Model.MyCheckBoxList[0]等等。