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

时间:2014-07-03 08:20:23

标签: c# html asp.net-mvc-3 razor

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

视野中的模型..

  @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,我只会获得第一个选定的模型。 我做错了什么?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

修改 忘记每个循环并读取this example on how to get the selected row data 然后获取ID,并将其存储在隐藏的输入中,然后在控制器操作的帖子上,您只需获取隐藏的输入值。