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

我在剃刀视图中有一张数据表,我在表格中为每行添加了一个复选框。 我试图将检查的列表返回到控制器中的后置操作。 但是模型在帖子后面显示为空。

Model in view ..

  @model IPagedList<TrackerModel>

在控制器中发布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>

Tracker 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中删除IList,我只会得到第一个选定的模型。 我在做什么错?


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

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

使用附加到复选框的javascript填充隐藏的输入,即在单击复选框时向隐藏的输入添加一个标识,然后在控制器操作上可以将其作为字符串访问; 我认为它甚至会自动在逗号之间插入逗号,使用类似于selectrow函数的东西,这些函数将循环通过网格并将选定的行ID放入隐藏的输入中。

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

编辑:忘记每个循环,并阅读本示例如何获取选定的行数据然后获取该ID,并将其存储在隐藏的输入中,然后在控制器操作上发布后,您只需获取隐藏的输入值。

链接地址: http://www.djcxy.com/p/53969.html

上一篇: How to return a list to the controller based on checkbox checked?

下一篇: Why is an empty Model returning to post method?