如何根据选中的复选框返回一个列表给控制器

本文关键字:一个 列表 控制器 返回 何根 复选框 | 更新日期: 2023-09-27 18:11:11

我在剃刀视图中有一个数据表,我为表中的每一行添加了一个复选框。我试图将复选列表返回到控制器中的post动作。然而,模型在post back时显示为null。

Model in view.

  @model IPagedList<TrackerModel>

Post actionResult在控制器....

     [HttpPost]
    public ActionResult Index(IList<TrackerModel> model)
    {
        return View(model);
    }

表单标签应用在另一个表中,因为表是在局部…

      <div id="all-calibrations-grid" class="pull-left tracker-container">
    @using (Html.BeginForm(FormMethod.Post))
   {
        {Html.RenderAction("AllCalibrations");}
         }
    </div>

追踪ViewModel . .

   public class TrackerModel
{
    public int Id { get; set; }
    public string EquipmentID { get; set; }
    public string EquipmentDescription { get; set; }
    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
    public DateTime? ExpectedReturnedToCustomer { get; set; }
    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
    public DateTime? DateOfCalibration { get; set; }
    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
    public DateTime? NextDueDate { get; set; }
    public bool StatusChange { get; set; } //01/07/2014
    public string Status { get; set; }
    public string CustomerName { get; set; }
}

所有校准…

  [RoleAuthorization(Roles = "Customer User Passive,LTS User Passive")]
    public PartialViewResult AllCalibrations(int? page, IPrincipal user)
    {
        int totalRecords;
        // the filter model is fully populated
        var filter = (CalibrationFilter)Session["_Filter"];
        filter.PageSize = ((CalibrationFilter)Session["_Filter"]).PageSize;
        filter.Page = page.HasValue ? page.Value - 1 : 0;
        IList<Calibration> calibrationList;
        if (user.IsInRole("LTS User Passive"))
        {
            LtsUser ltsUser = _ltsUserRepo.GetUser(user.Identity.Name);
            // access the required data from the calibration repository
            calibrationList = _calRepo.GetAllCalibrations(ltsUser.Customers, out totalRecords, filter);
        }
        else
        {
            CustomerUser custUser = _custUserRepo.GetUser(user.Identity.Name);
            var customer = new List<Customer> { _custRepo.GetCustomer(custUser.Customer.Name) };
            // access the required data (for a specific customer) from the calibration repository
            calibrationList = _calRepo.GetAllCalibrations(customer, out totalRecords, filter);
        }
        var customerViewList = Mapper.Map<IList<Calibration>, IList<TrackerModel>>(calibrationList);
        IPagedList<TrackerModel> pagedList = customerViewList.ToPagedList(filter.Page, filter.PageSize, totalRecords);
        return PartialView("AllCalibrations", pagedList);
    }

所有校准视图…

@using InstrumentTracker.ViewModels.TrackerModels
@using MvcPaging
@model IPagedList<TrackerModel>
@{
 Layout = null;
  AjaxOptions ajaxOpts = new AjaxOptions
 {
    UpdateTargetId = "all-calibrations-grid",
    HttpMethod = "POST"
    };
}

@RenderPage("StatusLegend.cshtml")

<span>Displaying @Model.ItemStart - @Model.ItemEnd of @Model.TotalItemCount Calibrations</span>

<table id="all-calibrations" class="grid tracker-grid">
 <colgroup>
    <col class="workno-data">
    <col class="equipmentId-data">
    <col class="equipmentDesc-data">
    <col class="calDate-data">
    <col class="nextDueDate-data">
    <col class="status-data">
 </colgroup>

 <thead>
     <tr>
       @* ADDED 23/06/2014 *@
              @if (this.User.IsInRole("LTS Admin"))
              {
           <th id="SelectHeader">
           <input type="submit" class="styledbutton" value="Save" /></th>
              }
        <th>Work<br />No.</th>
        <th>ID</th>
        <th>Description</th>
        <th>Calibrated<br />On</th>
        <th>Next<br />Due</th>
        <th id="status-header">Status<a id="status-help" href="#">?</a></th>
        @*Add the following to <th> tag if ? does not display correctly - style="text-overflow:clip;"*@
        @* the customer column is only shown for LTS users since customer only see 1 customers data *@
        @if (this.User.IsInRole("LTS User Passive"))
        {
            <th>Customer</th>
        }
      </tr>
 </thead>
    <tbody>
    @* iterate through each calibration shown on this page *@
    @for (int index = 0; index < Model.Count(); index++)
    {
        @Html.HiddenFor(m => Model.ElementAt(index).Id)
        @Html.HiddenFor(m => Model.ElementAt(index).EquipmentID)
        @Html.HiddenFor(m => Model.ElementAt(index).EquipmentDescription)
        @Html.HiddenFor(m => Model.ElementAt(index).DateOfCalibration)
        @Html.HiddenFor(m => Model.ElementAt(index).NextDueDate)
         @Html.HiddenFor(m => Model.ElementAt(index).CustomerName)
        <tr>
         @*<th name="SelectCells" style="display:none;"><input type="checkbox" name="selectedCals" value="<m => Model.ElementAt(index).Id>"/></th>*@
                                   @* ADDED 23/06/2014 *@
              @if (this.User.IsInRole("LTS Admin"))
              {
            <th>@Html.EditorFor(m => Model.ElementAt(index).StatusChange, new { name = "selectedCals" })</th>
              }

            @* The work number is a link to the calibration the work no. represents *@
            <td>@Html.ActionLink("WN–" + @Html.DisplayFor(m => Model.ElementAt(index).Id), "Index", "CalibrationViewer", new { id = Model.ElementAt(index).Id }, null)</td>
            <td>@Html.DisplayFor(m => Model.ElementAt(index).EquipmentID)</td>
            <td>@Html.DisplayFor(m => Model.ElementAt(index).EquipmentDescription)</td>
            <td>@Html.DisplayFor(m => Model.ElementAt(index).DateOfCalibration)</td>
            <td>@Html.DisplayFor(m => Model.ElementAt(index).NextDueDate)</td>
            <td>@Html.DisplayFor(m => Model.ElementAt(index).Status)</td>
            @* once again only the lts user sees the customer column data *@
            @if (this.User.IsInRole("LTS User Passive"))
            {
                <td>@Html.DisplayFor(m => Model.ElementAt(index).CustomerName)</td>
            }
         </tr>
         }
        </tbody>
     }
    </table>

    @* The page navigation for the recently completed table *@
    <div class="pager">
       @Html.Pager(Model.PageSize, Model.PageNumber, Model.TotalItemCount, ajaxOpts).Options(o => o.Action("AllCalibrations"))
    </div>

如果我从post actionResult中删除illist,我只得到第一个选择的模型。我做错了什么?

如何根据选中的复选框返回一个列表给控制器

我所做的是在视图中有一个隐藏的输入,其中包含所选记录的列表,然后将其作为控制器动作的参数…

<input id="selectedRecords" name="selectedRecords" type="hidden" />

使用附加到复选框上的javascript填充隐藏输入,即在单击复选框时为隐藏输入添加id,然后在控制器动作上您可以将其作为字符串访问;我认为它甚至会自动在值之间加上逗号,使用类似于selectrow函数的东西,它会循环遍历网格并将选定的id放入隐藏的输入…

$.each(checkedIds, function (value) {
    // stuff
});
编辑:

忘记每个循环,读一读这个示例,了解如何获取所选的行数据然后获取ID,并将其存储在隐藏输入中,然后在post到控制器操作时,您只需获取隐藏的输入值。