MVC3从控制器持久保存数据以查看控制器

时间:2013-02-05 10:04:47

标签: asp.net-mvc-3 razor

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

[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); 
}

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

请有人告诉我我做错了什么,为什么他们不会填充我最初通过的收藏品,并希望有一种方式可以检查那些已经检查过的那些?

感谢。

1 个答案:

答案 0 :(得分: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????
        }
    ) 
}

另外,你的答案无疑会注意到复选框可以在模型上使用布尔字段,而不是整数,而不是小数,而不是字符串=&gt;布尔。

因此,请确保模型上有一个布尔字段,该字段将保持复选框的状态。在我的例子中,这个字段被称为IsChecked,但显然你可以完全自由地发现它是一个更好的名字。