【问题标题】:MVC Pass Selected Checkbox Items in Partial View to Controller [duplicate]MVC将部分视图中的选定复选框项传递给控制器​​[重复]
【发布时间】:2017-06-06 19:04:44
【问题描述】:

我有一个部分观点,我希望客户在使用复选框时进行选择。然后我希望在单击提交按钮时将所选项目的 ID 发送到控制器。控制器将重定向到验证视图。什么是好的、简单且安全的解决方案?如果可能的话,我想避免使用 Javascript。谢谢!

查看

@model OrderTracking.Models.ViewModel.ItemDataView

<div>

@using (Html.BeginForm("VerifyItem", "ReserveItem", FormMethod.Get))
{
    //@Html.AntiForgeryToken()  //TODO: Wire-up
    <table class="table table-striped table-condensed table-hover">
        <thead>
            <tr>
                <th></th>
                <th>Item ID</th>
            </tr>
        </thead>
        <tbody>

            @foreach (var i in Model.ItemProfile)
            {
                <tr>
                    <td>@Html.CheckBoxFor(r => i.IsSelected, new { @class = "checkbox" })</td>
                    <td>@Html.DisplayFor(r => i.ItemId)</td>

                </tr>
            }
        </tbody>
    </table>



    @Html.ActionLink("Verify Order Information", "VerifyOrderInfo", "ReserveItem", "", new { @class = "btn btn-primary btn-large" } ) 

}

型号

namespace OrderTracking.Models.ViewModel
{
public class ItemProfileView
{
    [Key]
    public int ItemId { get; set; }
    public bool IsSelected { get; set; }

}

public class ItemDataView
{
    public IEnumerable<ItemProfileView> ItemProfile { get; set; }
}

}

控制器

    public ActionResult VerifyOrderInfo()  
    {

        return View();

    }

【问题讨论】:

  • 您不能使用 foreach 循环 - 请参阅 this answer 以绑定到集合(您需要为 ItemId 属性添加隐藏输入
  • 感谢您的链接。这是非常有用的信息。

标签: asp.net-mvc checkbox selected


【解决方案1】:

有很多方法可以做到这一点。需要对您的代码进行最少更改的一种方法是:

  • 将您的表单更改为 Post 并将操作更改为 VerifyOrderInfo

    @using (Html.BeginForm("VerifyOrderInfo", "ReserveItem", FormMethod.Post))

  • 将 IEnumerable 更改为 List 以便您可以按索引绑定

    public List&lt;ItemProfileView&gt; ItemProfile { get; set; }

  • 现在您可以按索引引用复选框并为 ItemId 添加隐藏输入

    @Html.CheckBoxFor(r =&gt; r.ItemProfile[i].IsSelected, new { @class = "checkbox" }) @Html.HiddenFor(r =&gt; r.ItemProfile[i].ItemId)

  • 使用 提交 按钮而不是 ActionLink

    &lt;input type="submit" name="Verify Order Information" class="btn btn-primary btn-large" /&gt;

  • 将模型添加到 VerifyOrderInfo 操作中,以便您可以针对它进行编码

    public ActionResult VerifyOrderInfo(ItemDataView model)

现在,当您提交表单时,它应该将模型发送到操作中,并使用 ItemProfile 列表填充 ItemId 和 IsSelected 表单输入项。

【讨论】:

  • 令人耳目一新的答案。简单,一步一步,一点也不神秘。一切似乎都正常,除了我无法让视图调用 VerifyOrderInfo 控制器而不是默认的 ReserveItem 控制器,但我明天会讨论。非常感谢!
  • 代码试图调用 ReserveItem 控制器。动作先在BeginForm("{action}", "{controller}",...)
  • 对不起。我说错了。我的意思是它正在调用 ReserveItem GET 操作而不是 VerifyOrderInfo POST 操作。这两个动作都在 ReserveItem 控制器中。我确实有一个 VerifyOrderInfo 视图。如果我尝试直接在地址栏中输入路径,我会收到“/应用程序中的服务器错误 - 找不到资源或其依赖项之一”。但是,如果我将 ViewOrderInfo 操作更改为 Get 而不是 Post,它将加载页面模板(当然,不包含任何数据)。
  • 我发现了问题。此表格是部分视图的一部分。我正在使用 javascript 加载函数来调用局部视图,并且该调用是从另一个默认为 GET 方法的表单中进行的。啊。再次感谢您的出色回答。
猜你喜欢
  • 2012-12-31
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 2019-08-09
  • 1970-01-01
相关资源
最近更新 更多