我在剃刀视图中有一个数据表,我在其中为表中的每一行添加了一个复选框。 我试图将检查列表返回到控制器中的后期操作。 但是,模型在回发后显示为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,我只会获得第一个选定的模型。 我做错了什么?
答案 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,并将其存储在隐藏的输入中,然后在控制器操作的帖子上,您只需获取隐藏的输入值。