【问题标题】:MVC3 Persisting data from controller to view back to controllerMVC3从控制器持久化数据以查看回控制器
【发布时间】:2013-02-05 18:09:09
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

    标签: asp.net-mvc-3 razor


    【解决方案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,但显然您可以随意找到一个更好的名称。

    【讨论】:

    • 非常棒,完全符合我的要求。感谢您的帮助!
    • 哦,是的,描述是一个 javascript 函数获取 desc 并在弹出窗口中显示它。
    • 您可以使用有效的 HTML5 data-* 属性:data_description = item.description
    • 我能问一下这个建议和这样做有什么区别吗? description = Model.Facilities[i].description... 只是您提出的那个是 HTML5,它是一个更好的更现代的标准吗?在这种情况下,我应该将我的代码更改为:data_description = item.description 如果是的话,什么是项目?再次感谢
    • 不同之处在于description 属性无效,如果您使用它,您已经破坏了HTML。 data-description 是要使用的正确属性。
    猜你喜欢
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多