如何根据选中的复选框返回一个列表给控制器
本文关键字:一个 列表 控制器 返回 何根 复选框 | 更新日期: 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到控制器操作时,您只需获取隐藏的输入值。