为什么复选框不会检查页面加载?

时间:2015-12-11 07:39:43

标签: asp.net-mvc-4

我有化合物表的下列数据库表(元素周期表中的化合物/元素)表数据中有拼写错误,所以忽略它们

enter image description here

数据是:

enter image description here

控制器:

    public class CheckboxController : Controller
    {
        //
        // GET: /Checkbox/
        testdbEntities db = new testdbEntities();

        [HttpGet]
        public ActionResult Index()
        {
            var comps = db.Compounds.Select(c => new CompoundModel { Id=c.Id, CompoundName=c.Name, IsSelected=c.IsSelected}).ToList();

            CheckboxVM cvm = new CheckboxVM { checkboxData=comps};

            return View(cvm);
        }

        [HttpPost]
        public string Index(IEnumerable<CheckboxVM> collection)
        {
            return "";
        }
}

模型类CompoundModel是:

public class CompoundModel
{
    public int Id { get; set; }
    public string Code { get; set; }


    public string CompoundName { get; set; }
    public bool IsSelected { get; set; }
}

和ViewModel CheckBoxVM:

public class CheckboxVM
{        
    public string Id { get; set; }
    public string CompoundNmae { get; set; }        
    public bool IsSelected { get; set; }        
    public IEnumerable<CompoundModel> checkboxData { get; set; }   
}

当页面加载时,它应该显示带有名称的复选框,如果db表已经检查了它们(IsSelected=1)那么它们应该被检查。在帖子后面我需要接收用户检查的{{ 1}}。目前,我的代码符合第一个要求,即在页面加载时根据checkboxes检查已选中的checkboxes。有办法解决这个问题吗?

如果你需要一个带调试的视频,请问我很乐意发帖:)

观点:(更新)

IsSelected

1 个答案:

答案 0 :(得分:2)

您不能使用foreach循环来生成表单控件。它会生成重复的name属性(与您的模型没有关系)和重复的id属性(无效的html)。

为您的模型创建自定义`EditorTemplate

/Views/Shared/EditorTemplates/CompoundModel.cshtml

@model recitejs1.Models.CompoundModel
@Html.HiddenFor(m => m.Id)
@Html.HiddenFor(m => m.CompoundName)
@Html.CheckBoxFor(m => m.IsSelected)
@Html.LabelFor(m => m.CompoundName)

然后在主视图中

@model recitejs1.Models.CheckboxVM
....
@using (Html.BeginForm())
{
  @Html.EditorFor(m => m.checkboxData)
  <input type="submit" name="name" value="Send" />
}

EditorFor()方法会为集合中的每个项目生成正确的html

注意:您应该在进行此更改之前和之后检查html,以便更好地了解模型绑定的工作原理。

另请注意,您的POST方法参数必须为

public string Index(CheckboxVM model)

因为这是视图的基础。但是,您在视图中使用CheckboxVM的唯一属性是IEnumerable<CompoundModel> checkboxData,在这种情况下,您的视图应为

@model IEnumerable<CompoundModel>
...
@Html.EditorFor(m => m)

并按原样保留POST方法(但更改GET方法)