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