MVC将POST数据传递给View

时间:2015-07-31 10:06:27

标签: jquery asp.net-mvc twitter-bootstrap http-post

我的索引视图显示从其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");
}

0 个答案:

没有答案