【问题标题】:Passing model with list of checkboxes from view to controller将带有复选框列表的模型从视图传递到控制器
【发布时间】:2019-07-02 22:22:58
【问题描述】:

我正在尝试将模型从视图传递回控制器。我将 NaborViewModel 传递给 View。它是一个对象列表,每个对象都有 4 个复选框(其中一些是随机选中的)。

型号:

public class NaborViewModel
{
    public List<WowClass> WowClasses { get; set; }
}

动作:

    [HttpGet]
    public ActionResult Nabor()
    {
        NaborViewModel viewModel = new NaborViewModel();
        DatabaseDataContext context = new DatabaseDataContext();
        viewModel.WowClasses = context.WowClasses.ToList();

        return View(viewModel);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Nabor(NaborViewModel model)
    {
        //DB actions
        return RedirectToAction(Consts.ActionNabor);
    }

在视图中,我有 2 个表格,每个表格都有不同的方法。第一个是我创建的,认为它可能会起作用。 第二种形式是我在网上找到的方法。 第一个是正确显示传递的数据(填充复选框)。第二个甚至显示未选中的每个复选框。 提交表单时,它们都将 null 返回给控制器操作。

查看:

        @using (Html.BeginForm(Consts.ActionNabor, Consts.ControllerAdmin, FormMethod.Post))
        {
            @Html.AntiForgeryToken()
            <table class="admin-table">
                <thead>
                    <tr>
                        <th>Class</th>
                        <th>Status</th>
                        <th colspan="3">Požadované talenty</th>
                    </tr>
                </thead>
                <tbody>
                    @foreach (var cls in Model.WowClasses)
                    {
                        <tr>
                            @Html.HiddenFor(x => cls.Id)
                            <td>@cls.ClassName</td>
                            <td>@Html.CheckBoxFor(x => cls.Open)</td>
                            <td style="text-align: left">@Html.CheckBoxFor(x => cls.NeedTalents1) <span>@cls.Talents1</span></td>
                            <td style="text-align: left">@Html.CheckBoxFor(x => cls.NeedTalents2) <span>@cls.Talents2</span></td>
                            <td style="text-align: left">@Html.CheckBoxFor(x => cls.NeedTalents3) <span>@cls.Talents3</span></td>
                        </tr>
                    }
                </tbody>
            </table>

            <input type="submit" value="@Consts.Submit" />
        }

        <div class="horizontal-line-both"></div>

        @using (Html.BeginForm(Consts.ActionNabor, Consts.ControllerAdmin, FormMethod.Post))
        {
            @Html.AntiForgeryToken()
            <table class="admin-table">
                <thead>
                    <tr>
                        <th>Class</th>
                        <th>Status</th>
                        <th colspan="3">Požadované talenty</th>
                    </tr>
                </thead>
                <tbody>
                    @for (int i = 0; i < Model.WowClasses.Count; i++)
                    {
                        <tr>
                            <td>
                                <input type="text" value="@Model.WowClasses[i].ClassName" name="Expense[@i].Id">
                            </td>
                            <td>
                                <input type="checkbox" value="@Model.WowClasses[i].Open" name="Expense[@i].Id">
                            </td>
                            <td>
                                <input type="checkbox" value="@Model.WowClasses[i].NeedTalents1" name="Expense[@i].Id">
                            </td>
                            <td>
                                <input type="checkbox" value="@Model.WowClasses[i].NeedTalents2" name="Expense[@i].Id">
                            </td>
                            <td>
                                <input type="checkbox" value="@Model.WowClasses[i].NeedTalents3" name="Expense[@i].Id">
                            </td>
                            <td>
                                <input type="hidden" value="@i" name="Expense[@i].Id">
                            </td>
                        </tr>
                    }
                </tbody>
            </table>

            <input type="submit" value="@Consts.Submit" />
        }

【问题讨论】:

    标签: c# asp.net asp.net-mvc model-view-controller


    【解决方案1】:

    我将这与您的两种方法结合使用。请参阅以下内容:

    @for (int i = 0; i < Model.WowClasses.Count; i++)
    {
        ...
        <tr>
            @Html.EditorFor(model => model.WowClasses[i].Open)
        </tr>
        ...
    }
    

    通过索引访问List 中的每个项目是关键。如果您查看使用此方法生成的 HTML,每个项目的名称都包括其索引(在上面的示例中,生成的输入名称是:name="WowClasses[0].Open")。这就是您的控制器操作可以区分列表项的方式。

    【讨论】:

      【解决方案2】:

      对于您的第二个表单,您可以像这样修改每个输入字段,

      对于复选框,

      <input type="checkbox" id="WowClasses_@(i)_Open" name="WowClasses[@i].Open" value="true" />
      

      对于输入字段,

      <input type="checkbox" id="WowClasses_@(i)_ClassName" name="WowClasses[@i].ClassName" value="true" />
      

      您只需更改您的类属性提交的每个输入。希望这是您的帮助

      【讨论】:

        猜你喜欢
        • 2015-10-06
        • 2019-09-03
        • 2014-08-24
        • 2013-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-26
        相关资源
        最近更新 更多