2013-03-18 106 views
1

我在将集合绑定到模型时遇到了一些问题。我跟着this link创建了一个复选框列表。我不知道有多少代码来提供,但我认为有以下型号MVC绑定到模型的复选框列表

Public class Model1{ 
    public string param1{get; set;} 
    public string param2{get; set;} 
} 

Public class Model2{ 
    public string param1{get; set;} 
    public string param2{get; set;} 
} 

Public class Model3: Model2{ 
    public bool chk {get; set;} 
    public list<string> param{get; set;} 
    public Model3() 
    { 
     param = new List<string>(){"one", "two", "three"}; 
    } 
} 



public class superModel{ 
     public Model1 first{get; set;} 
     public IEnumerable<Model2> second{get; set;} 
     public List<Model3> third{get; set;} 
    } 

在我的控制,我已经定义了parametr三分之一

third = AnEnumerableList.Select(e=> new Model3{chk=false, param1 = e.Param, param2 = e.Param1}).ToList(); 

,并在我看来,我通过超级名模持有我所有的班级模特。我创建这样一个复选框:

for(int i=0; i<Model.third.Count; i++){ 
    @Html.CheckBoxFor(m => m.third[i].chk, new {onchange="test()"}) 
    @Html.HiddenFor(m => m.third[i].param) 
    @Html.HiddenFor(m => m.third[i].param1) 
    @Html.HiddenFor(m => m.third[i].param2) 

}

JavaScript的样子

function test(){ 
    alert('@Model.third[0].chk') 
} 

当我看到生成的源代码,一切都看起来不错,但JavaScript代码总是返回false不管该复选框是否被选中。当提交视图表单时,整个视图不会显示。相反,我会看到第一个选中复选框的名称为部分视图。当这个集合中没有选择任何东西时,返回的视图被提交。我试图调试代码,但在这个过程中没有任何中断。

我知道,这个我可能没有足够的issolated这个问题,但这是我所能...

回答

1

那是因为你正在寻找的模式价值和当前复选框的值。你需要去改变它,首先,改变你的复选框声明传递this,就像这样:

@Html.CheckBoxFor(m => m.third[i].chk, new {onchange="test(this)"}) 

然后稍微改变你的测试功能,为:

function test(item){ 
    alert(item.checked) 
} 
+0

谢谢。你是对的。这效果更好。但我仍然面临一个问题。出于某种原因,每当选中一个复选框并提交表单时,会获得一个空白视图,其中包含所选第一个复选框的名称。没有选中复选框时一切正常。这可能太宽泛,但你有什么想法可以导致这一点? – jpo 2013-03-18 12:20:00

+0

@jpo没问题!嗯,这听起来像你的后期行动方法返回的问题。你可以发布你的'HttpPost'行动吗? – mattytommo 2013-03-18 12:21:09

+0

非常感谢。一些奇怪的事情似乎在那个级别上发生。我简化了代码,它工作。我会从这里弄清楚这个问题。谢谢! – jpo 2013-03-18 12:27:28