我真的找不到直接从View向Controller传递项目列表的方法,因此我决定使用AJAX。
我将控制器的参数从 List <>更改为 int [], 以获取项目ID的数组:
public ActionResult SubmitExpenses(int[] expenseIDs, DateTime? expenseDate = null, DateTime? expenseDate2 = null, int? userId = 0) { expenseDate = (DateTime)Session["FirstDate"]; expenseDate2 = (DateTime)Session["SecondDate"]; if (expenseDate == null || expenseDate2 == null) { expenseDate = DateTime.Now.AddMonths(-1); expenseDate2 = DateTime.Today; } string currentUserId = User.Identity.Name; var query = from e in db.Expenses join user in db.UserProfiles on e.UserId equals user.UserId where e.ExpenseDate >= expenseDate && e.ExpenseDate <= expenseDate2 && e.DateSubmitted == null orderby e.ExpenseDate descending select new { e, user }; if (User.IsInRole("admin") && userId != 0) { query = query.Where(x => x.user.UserId == userId); } else if (!User.IsInRole("admin")) { query = query.Where(x => x.user.UserName == currentUserId); } //var localExpenseIDs = expenseIDs; var joined = from dbExpense in query.Select(x => x.e).AsEnumerable() join localExpense in expenseIDs on dbExpense.ExpenseId equals localExpense where localExpense == dbExpense.ExpenseId select dbExpense; foreach (Expense exp in joined) { exp.DateSubmitted = DateTime.Today; exp.IsSubmitted = true; } try { db.SaveChanges(); return RedirectToAction("Index"); } catch (Exception e) { Console.WriteLine(e); return RedirectToAction("Submit"); } }在我看来,我将每个项目的ID分配给它自己的HTML复选框的ID:
@foreach (var item in Model) { <tr> <td > @Html.CheckBox("isSubmitted", new{ @id = @Html.DisplayFor(modelItem => item.ExpenseId), @class = "submitBox"}) </td> </tr> }<div> @Html.Actionlink("Submit Expenses", "", "", null, new { @id = "submitExpenseslink" })</div>我写了一些jQuery,以便选中的每个复选框都将输入元素的ID添加到数组中,并且整数数组将被过 帐 到 SubmitExpenses 操作中:
var checkedArray = []; $(':checkbox[name=isSubmitted]').on('change', function () { checkedArray = $(':checkbox[name=isSubmitted]:checked').map(function () { return this.id; }) .get(); //alert(checkedArray); }); $('#submitExpenseslink').click(function () { $.ajax({ type: "POST", traditional: true, url: "@Url.Action("SubmitExpenses", "Expenses")", data: { expenseIDs: checkedArray }, success: function () { alert("Success!"); }, error: function (XMLHttpRequest, textStatus, errorThrown) { if (debug) { alert(XMLHttpRequest.responseText); alert(textStatus); alert(errorThrown); } } }); })


