如何在ASP.NET MVC4表中执行简单的多选

时间:2012-12-13 22:21:21

标签: c# javascript asp.net-mvc entity-framework

以下是我的观点:

@model Affiliate


<div class="box paint color_16">
<div class="title">
    <h4><i class="icon-tasks"></i><span>@Model.CompanyName's Commissions</span> </h4>
</div>
<div class="content top ">
    <div class="subtitle">
        @Html.ActionLink("Void", "DeleteInvoice", new { commList = "??", affId = Model.Id }, new { @class = "btn" })
        @Html.ActionLink("Create Invoice", "CreateInvoice", new { commList = "??", affId = Model.Id }, new { @class = "btn" })
        @Html.ActionLink("Pay", "PayInvoice", new { commList = "??", affId = Model.Id }, new { @class = "btn" })
    </div>

    <table class="table table-striped table-hover">
        <tr>
            <h3>Commissions</h3>
        </tr>
        <tr>
            <td></td>
            <td>Amount</td>
            <td>Status</td>
            <td>Action</td>
        </tr>
        @foreach (var item in Model.Commissions)
        {
            <tr>
                @if (item.Status == ViewBag.PaymentStatus || ViewBag.PaymentStatus == "All")
                {
                    <td>@Html.CheckBox("commId", new { value = item.Id })</td>
                    <td>@Html.DisplayFor(x => item.PayoutAmount)</td>
                    <td>@Html.DisplayFor(x => item.Status)</td>
                }
            </tr>
        }
    </table>
</div>

我想要做的是当我点击顶部的动作链接时,从表格中获取所有已检查的项目,并将该ID列表传递给控制器​​逻辑。我假设一个viewmodel可能是解决方案,如下所示:

 public Affiliate affilite { get; set; }
 public List<int> selectedItems { get; set; }
 etc.

但是如何将所选项目放入VM selectedItems容器?

2 个答案:

答案 0 :(得分:2)

根据你的评论,你似乎没有找到最“正确”的答案,而只是一个快速而肮脏的“我将如何做到这一点”的答案。如果您只想传递列表,可以像下面这样设置控制器操作:

public ActionResult MyAction(int[] id)
{
    ...
}

或者,您似乎表明它是一个强类型的视图模型,其属性包含一个List(我会缩短属性的名称,你会在一秒钟内看到原因)。

在javascript中,最简单的方法是使用jQuery绑定超链接上的click事件,该事件获取已检查的项目列表并将其附加到查询字符串。

$("#myLink").click(function()
{
    var url = "site.com/action?";
    var ids = $(".table").find("input:checked");

    ids.each(function()
    {
        url += "id=" + $(this).val() + "&"
    });

    window.location = url;
});

基本上,您希望创建一个长查询字符串,其中action参数的名称反复重复,这标识了一个数组。它看起来像这样(id代表MyAction中的int [] id):

id=15&id=20&id=25&id=30&....

然后在构建查询字符串后,将用户重定向到该URL。然后,MVC应该能够将它绑定到一个数组,并且你已经完成了设置。

无论如何,这基本上就是这个想法;我写的语法和javascript可能是关闭所以不要复制我的代码并期望它按原样工作 - 我写的是我的头脑。如果您的操作绑定到viewmodel,则需要将查询字符串中的参数设置为模型属性的名称:

selectedids=1&selectedids=2&selectedids=3...

或者,如果数组是对象的属性,则该属性是模型的属性...

model.selectedids=1&model.selectedids=2&model.selectedids=3...

你只需要玩一些。

答案 1 :(得分:0)

在表单标记内使用html检查(您也可以使用帮助程序)并将模型发布到后期操作。 MVC将自动序列化模型