MVC 复选框未绑定到 EditorTemplate 中的模型

MVC checkbox not binding to model in EditorTemplate

出于我的目的,我不得不使用 EditorTemplate 而不是传统的 Html.CheckBoxFor。在此过程中,我似乎弄乱了它的约束力。是否存在以下未绑定到传入模型的原因?

<input data-val="true"
        data-val-required="The @Html.Raw(checkSuffix) field is required."
        id="@Html.Raw(checkId)"
        name="@Html.Raw(checkName)"
        type="checkbox"
        value="true">
<input name="@Html.Raw(checkName)"
        type="hidden"
        value="false">
<label for="@Html.Raw(checkId)"
        name="@Html.Raw(labelName)">
    <span class="fa-stack">
        <i class="fa fa-square-o fa-stack-1x"></i>
        <i class="fa fa-check fa-stack-1x"></i>
    </span>
    @Model.Label
    @Html.HiddenFor(item => item.Label)
</label>

注意:模型在发布到服务器时正确绑定,而不是在页面重新加载或回发时绑定。

编辑:已生成 HTML:

<input data-val="true" data-val-required="The IsChecked field is required." id="Issues_0__IsChecked" name="Issues[0].IsChecked" type="checkbox" value="true">
<input name="Issues[0].IsChecked" type="hidden" value="false">
<label for="Issues_0__IsChecked" name="Issues[0].Label">
    <span class="fa-stack">
        <i class="fa fa-square-o fa-stack-1x"></i>
        <i class="fa fa-check fa-stack-1x"></i>
    </span>
    My Transmitting Computer/Server is not working
    <input id="Issues_0__Label" name="Issues[0].Label" type="hidden" value="My Transmitting Computer/Server is not working">
</label>

您尝试手动创建 html 时给出与 CheckBoxFor() 方法相同的 html,只是您从未设置 checked 属性,因此在显示视图时(无论是最初还是如果您 return POST 方法中的视图)所有复选框都将被取消选中。

您没有发布您的模型或视图,但很明显您没有正确使用您的 EditorTemplate。假设您有以下型号

public class MainModel
{
  public IEnumerable<NestedModel> Issues { get; set; }
}
public class NestedModel
{
  public bool IsChecked { get; set; }
  public string Label { get; set; }
}

然后在/Views/Shared/EditorTemplates中创建一个名为NestedModel.cshtml的局部视图(注意名称必须与class的名称匹配)

@model yourAssembly.NestedModel
@Html.CheckBoxFor(m => m.IsSelected)
<label for="@Html.IdFor(m => m.IsSelected)"> // use IdFor() and no need to add name attribute
  <span class="fa-stack">
    <i class="fa fa-square-o fa-stack-1x"></i>
    <i class="fa fa-check fa-stack-1x"></i>
    @Html.DisplayFor(m => m.Label)
</label>
@Html.HiddenFor(m => m.Label)

然后在主视图中

@model yourAssembly.MainModel
@using (Html.BeginForm())
{
  @Html.EditorFor(m => m.Issues)
  ...

请注意,EditorFor() 方法接受 IEnumerable<T> 并将为集合中的每个项目生成正确的 html(带索引器)。

不清楚为什么你有 属性 Label 只是出现在 return "My Transmitting Computer/Server is not working" 中。相反,您的模型应该是

public class NestedModel
{
  [Display(Name = "My Transmitting Computer/Server is not working")]
  public bool IsChecked { get; set; }
}

并在 EditorTemplate 中,将 @Html.DisplayFor(m => m.Label) 替换为 @Html.DisplayNameFor(m => m.IsChecked) 并删除隐藏的输入。

最后,如果您经常使用这些图标创建 <label>,请考虑创建一个 HtmlHelper 扩展方法,这样您就可以简单地使用(比如)@Html.MyCoolLabel(m => m.IsSelected) 来生成所有 html。