0

我有一个包含几个列表的模型:

[Display(Name = "Facilities")]
public List<facility> Facilities { get; set; }

[Display(Name = "Accreditations")]
public List<accreditation> Accreditations { get; set; }

我最初从我的控制器填充这些列表:

public ActionResult Register()
{
    var viewModel = new RegisterModel();

    viewModel.Facilities = m_DBModel.facilities.ToList();
    viewModel.Accreditations = m_DBModel.accreditations.ToList();

    return View(viewModel);
}

当他们到达我的视野时,他们会填充数据库记录(很棒)。然后,我将模型传递给将这些列表显示为复选框的局部视图,以供用户操作(我根据另一个建议尝试使用 for 循环而不是 foreach 循环,没有区别):

@model LanguageSchoolsUK.Models.RegisterModel

@foreach (var item in Model.Facilities)
{
    @Html.Label(item.name);
    @Html.CheckBox(item.name, false, new { id = item.facility_id, @class = "RightSpacing", @description = item.description }) 
}

当我提交表单并最终回到我的控制器时,这次调用控制器上的重载注册函数:

[HttpPost]
public ActionResult Register(RegisterModel model)
{
    if (ModelState.IsValid)
    {
        // Do stuff
    }

    return View(model); 
}

问题是包含列表(设施和认证)的模型参数告诉我列表为空。

请有人告诉我我做错了什么,为什么它们没有填充我最初通过的集合,并希望有一种方法可以询问哪些已经检查过的集合?

谢谢。

4

1 回答 1

1

我已经尝试基于另一个建议使用 for 循环而不是 foreach 循环,没有区别

再试一次,我相信这一次你会有更多的运气。哦,使用强类型助手:

@model LanguageSchoolsUK.Models.RegisterModel
@for (var i = 0; i < Model.Facilities.Count; i++)
{
    @Html.HiddenFor(x => x.Facilities[i].name)
    @Html.LabelFor(x => x.Facilities[i].IsChecked, Model.Facilities[i].name);
    @Html.CheckBoxFor(
        x => x.Facilities[i].IsChecked, 
        new { 
            id = item.facility_id, 
            @class = "RightSpacing", 
            description = item.description // <!-- HUH, description attribute????
        }
    ) 
}

此外,您无疑会从我的回答中注意到复选框与模型上的布尔字段一起使用,而不是整数、小数、字符串 => 布尔值。

因此,请确保您的模型上有一个布尔字段,它将保存复选框的状态。在我的示例中,此字段被调用IsChecked,但显然您完全可以随意找到一个更好的名称。

于 2013-02-05T10:09:09.087 回答