我的索引视图显示从其Index()
操作方法加载的成员表。每个表行都有一个复选框。表外是一个删除按钮。
“删除”按钮(单击时)向其POST
操作方法ViewModel
发送包含POST
数据(即行ID)的Index()
请求。
到目前为止一切都很标准。直到下一部分(我不高兴)...
在Index()
帖子操作方法中,我将行ID存储到TempData
,然后将RedirectToAction
存储到Remove() GET
操作方法。
我想在这里将数据提交到数据库,但是我必须显示一个"你确定要删除这些记录吗?#34;页。因此重定向。
在Remove() GET
操作方法中,我从TempData
获取行数据,然后显示行(使用ID
我从数据库中获取数据)。单击“提交”按钮会发送POST
请求,Remove() POST
操作方法会删除这些行。
在这两个TempData
请求对之间使用GET/POST
&#39;看起来像一条路,即糟糕的设计让它发挥作用。鉴于数据是一个集合List<int>()
,即一个复杂的类型,我不能在这里使用RedirectToAction
。
问题:是否有更好的方法可以将POST
个数据(所选行)传递给View
?
有很多SO帖子询问RedirectToAction
通过POST
是否有可能,答案似乎是“否”&#39;。这是可以理解的。
选项:如果没有其他方法,那么我可能不得不考虑使用带有所选行数据的Bootstrap Modal,以及POST
的删除按钮通过Ajax。但问题是尝试通过jQuery从View
读取所选(复选框选中)行的列表似乎很难(对于我有一些有用的jQuery知识)。然后通过Ajax POST
。
下面的代码段,我删除了不相关的代码,因此忽略任何语法/拼写错误。
索引视图
@model MyProject.Models.Members.MembersViewModel
... more view code
<div class="row">
<div class="col-md-12">
@using (Html.BeginForm("Index", "Members", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
... table with @EditorFor()
<div class="col-md-2">
<input type="submit" value="Remove" id="buttonRemove" class="btn btn-primary" />
</div>
}
</div>
</div>
Controller Index()动作方法
public ActionResult Index()
{
MembersViewModel membersViewModel = new MembersViewModel();
// Fetch members from the database
List<Member> members = _BLL.GetAllMembers();
// Map domain model to viewmodel
... automapper code here
membersViewModel.Members = members;
return View(membersViewModel);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(MembersViewModel membersViewModel)
{
// Get the ids of the items selected (GetSelectedIDs() method on VM iterates through private list and returns selected IDs)
IEnumerable<int> selectedMembersIDs = membersViewModel.GetSelectedIDs();
// Store IDs
TempData["SelectedMembers"] = selectedMembersIDs.ToList();
return RedirectToAction("Remove");
}
Controller Remove()动作方法
public ActionResult Remove()
{
List<int> selectedMembersIDs = TempData["SelectedMembers"] as List<int>;
if (selectedMembersIDs.Count == 0)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
// Fetch members details
List<Member> members = _BLL.GetSelectedMembers(selectedMembersIDs);
if (members.Count == 0)
{
return HttpNotFound();
}
// Map domain model to viewmodel
DeleteMembersViewModel deleteMembersViewModel = new DeleteMembersViewModel();
foreach (Member member in members)
{
deleteMembersViewModel.Members.Add(member);
}
return View(deleteMembersViewModel);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Remove(DeleteMembersViewModel deleteMembersViewModel)
{
List<int> selectedMembersIDs = new List<int>();
foreach(Member member in deleteMembersViewModel.Members)
{
selectedMembersIDs.Add(member.ID);
}
_BLL.RemoveGroupMembers(selectedMembersIDs);
return RedirectToAction("Index");
}