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

C# 如何在表ASP.NET MVC4中执行简单的多重选择,c#,javascript,asp.net-mvc,entity-framework,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

以下是我的观点:

@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>
@model附属公司
@范本.公司名称佣金
@ActionLink(“Void”,“DeleteInvoice”,new{commList=“?”,affId=Model.Id},new{@class=“btn”})
@ActionLink(“创建发票”,“创建发票”,新建{commList=“?”,affId=Model.Id},新建{@class=“btn”})
@ActionLink(“Pay”,“PayInvoice”,new{commList=“?”,affId=Model.Id},new{@class=“btn”})
佣金
数量
地位
行动
@foreach(模型佣金中的var项目)
{
@如果(item.Status==ViewBag.PaymentStatus | | ViewBag.PaymentStatus==“全部”)
{
@CheckBox(“commId”,new{value=item.Id})
@DisplayFor(x=>item.payoutaunt)
@DisplayFor(x=>item.Status)
}
}

我希望能够做到的是,当我点击顶部的actionlink时,从表中抓取所有被检查的项目,并将id列表传递给控制器逻辑。我假设viewmodel可能是解决方案,如下所示:

 public Affiliate affilite { get; set; }
 public List<int> selectedItems { get; set; }
 etc.
public ActionResult MyAction(int[] id)
{
    ...
}
public-affilite{get;set;}
公共列表selectedItems{get;set;}
等

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

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

根据您的评论,您似乎并不是在寻找最“正确”的答案,而是一个快速而肮脏的“我该怎么做”答案。如果您只想通过列表,可以按如下方式设置控制器操作:

 public Affiliate affilite { get; set; }
 public List<int> selectedItems { get; set; }
 etc.
public ActionResult MyAction(int[] id)
{
    ...
}
或者,您似乎指出它是强类型的视图模型,其属性包含一个列表(我将缩短属性的名称,稍后您将了解原因)

在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;
});
基本上,您希望创建一个长查询字符串,其中动作参数的名称反复出现,以标识数组。它看起来像这样(id是MyAction中int[]id的缩写):

然后,一旦建立了查询字符串,就将用户重定向到该url。MVC应该能够将其绑定到一个数组,这样您就一切就绪了

不管怎么说,基本上就是这个想法;我写的语法和javascript可能有点不对劲,所以不要复制我的代码,期望它能按原样工作——我是在脑子里写的。如果操作绑定到viewmodel,则需要将查询字符串中的参数设置为模型属性的名称:

selectedids=1&selectedids=2&selectedids=3...
或者,如果数组是对象的属性,而对象是模型的属性

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

您只需要玩一下就可以了。

为什么您提到视图模型,但仍然在视图中使用ViewBag?这两件事是相互矛盾的,不应该一起使用。正确的方法当然是使用视图模型并去掉ViewBag。所以我首先要为这个视图定义一个真实的视图模型。在这个网站上应该至少有十几个类似的答案,我在其中演示了视图模型和编辑器模板的使用。这不是最终的代码,如果你阅读了这个问题,也不是关于他使用视图模型的问题。问题是如何将viewmodel属性绑定到用户选择的任何对象。欢迎有帮助的回答,关于模拟示例代码中使用的方法的讥讽和屈尊问题可以在另一个论坛上找到。但是你的视图模型在哪里?我所能看到的只是一些
分支机构
域模型,您将其作为属性放在您称之为视图模型的东西中。但视图模型不是这样工作的。它们不应该引用您的域模型。视图模型应该定义为反映视图的要求。我现在没有编写视图模型。这是我头脑中的一个想法,可能会导致一个解决方案。我还没有想出来写出来。我所知道的是,我有一个针对x的表,如何根据用户检查的内容获取x.id列表。即使它是一个逗号删除的字符串,也无所谓,只需要将这些int返回到我的控制器,这样我就可以使用它们了。就架构而言,可能有更好的方法,但我正在寻找一些我可以从这个域模型中实现的东西来获得我需要的列表。现在这不是一个表单,我正在寻找一个解决方案来将选中项目的列表传递给一个单独的actionlink。因此,在url参数中,我猜您可以为每个操作序列化jQuery帖子中的所有检查(或带有检查的表单)