Asp.net mvc 用于不与嵌套对象绑定的复选框
当在嵌套在模型中的对象中定义特性时,CheckBoxFor是否没有边界 这里有一个例子。我有一个Asp.net mvc 用于不与嵌套对象绑定的复选框,asp.net-mvc,asp.net-mvc-3,razor,binding,checkbox,Asp.net Mvc,Asp.net Mvc 3,Razor,Binding,Checkbox,当在嵌套在模型中的对象中定义特性时,CheckBoxFor是否没有边界 这里有一个例子。我有一个SearchOptions模型,它包含一个列表属性。每个Star都有一个数字、一个名称和一个bool属性,这些属性应该是有界的: public class SearchOptions { public SearchOptions() { // Default values Stars = new List<Star>() {
SearchOptions
模型,它包含一个列表
属性。每个Star
都有一个数字、一个名称和一个bool
属性,这些属性应该是有界的:
public class SearchOptions
{
public SearchOptions()
{
// Default values
Stars = new List<Star>()
{
new Star() {Number=1, Name=Resources.Home.Index.Star1,
IsSelected=false},
new Star() {Number=2, Name=Resources.Home.Index.Star2,
IsSelected=false},
new Star() {Number=3, Name=Resources.Home.Index.Star3,
IsSelected=true},
new Star() {Number=4, Name=Resources.Home.Index.Star4,
IsSelected=true},
new Star() {Number=5, Name=Resources.Home.Index.Star5,
IsSelected=true},
};
}
public List<Star> Stars { get; set; }
}
控制器(相关部分)为:
public ActionResult SearchOptions()
{
return View(new SearchOptions());
}
[HttpPost]
public ActionResult Do(SearchOptions s)
{
// Do some stuff
return View("SearchOptions", s);
}
这是因为您是如何访问
复选框for
表达式中的属性的
@for (int i = 0; i < Model.Stars.Count(); i++) {
@Html.CheckBoxFor(m => m.Stars[i].IsSelected)
<label>@Model.Stars[i].Name</label>
}
@for(inti=0;im.Stars[i].IsSelected)
@Model.Stars[i].Name
}
这应该对你有用
以下是不同方法的输出:
//using the for loop
<input id="Stars_2__IsSelected" name="Stars[2].IsSelected" type="checkbox" value="true" />
//using the foreach
<input checked="checked" id="s_IsSelected" name="s.IsSelected" type="checkbox" value="true" />
//使用for循环
//使用foreach
您会注意到,for foreach在进行模型绑定时没有包含与之匹配的正确名称。您的代码看起来很好-到底出了什么问题?您是否通过
视图(模型)
传入模型?Do(SearchOptions s)
显示s
具有旧的(默认)值,即使我选中/取消选中了所有复选框。谢谢你的帮助,啊。在这种情况下,原因是嵌套属性。CheckBoxFor()
的输出将其名称值设置为s.IsSelected
而不是Model.Star[].IsSelected
。我会看看我能做些什么,或者其他人会在我之前发布答案:)有效。但有一个奇怪的问题:POST标签得到一个空值之后。我刚刚使用了
,没有使用边界Model.Stars[I]。将名称指定给某个输入字段。你知道为什么吗?编辑:使用Html.HiddenFor解决。但这是正确的方法吗?为要绑定的对象的每个属性编写一个hidden是一件很麻烦的事……原因是Html
帮助程序使用列表项中的post值。由于Name
属性的post值为null
,因此在重用时它们将为空(因为它们将覆盖默认值)。我不确定除了在输出前重新填充名称和数字之外,您还可以做些什么。据我所知,这对列表或数组属性不起作用,我可能是错的。有没有办法用foreach循环而不是for循环来实现这一点?
//using the for loop
<input id="Stars_2__IsSelected" name="Stars[2].IsSelected" type="checkbox" value="true" />
//using the foreach
<input checked="checked" id="s_IsSelected" name="s.IsSelected" type="checkbox" value="true" />