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