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

时间:2015-10-09 13:06:19

标签: c# asp.net asp.net-mvc binding mvc-editor-templates

出于我的目的,我不得不使用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>

1 个答案:

答案 0 :(得分:2)

您尝试手动创建html时会提供与CheckBoxFor()方法相同的html,但您在显示视图时从未设置checked属性(最初或者如果您返回视图) 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的部分视图(注意名称必须与班级名称匹配)

@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似乎只是返回"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。