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