Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 用于不与嵌套对象绑定的复选框_Asp.net Mvc_Asp.net Mvc 3_Razor_Binding_Checkbox - Fatal编程技术网

Asp.net mvc 用于不与嵌套对象绑定的复选框

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>() {

当在嵌套在模型中的对象中定义特性时,CheckBoxFor是否没有边界

这里有一个例子。我有一个
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" />