ASP.NET MVC - 使用MultiSelect删除multiplie行

时间:2016-10-01 10:23:45

标签: c# asp.net asp.net-mvc

我希望使用MultiSelect删除多个数据行,我不知道从哪里开始。

我有一个详细信息页面,我有多个评论,由用户创建。到目前为止,我只能删除一个。如何添加MultiSelect并同时删除所有选中的内容?

审核模型。

    public System.Guid Id { get; set; }

    public System.Guid CreatorId { get; set; }

    [Required]
    public string Title { get; set; }

    [Required]
    public string Description { get; set; }

查看 - 列出所有已创建的评论

@model IEnumerable<xxxx.Review>

<h2>Reviews</h2>

<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Title)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Description)
        </th>
</tr>
 @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Title)
            </td>
            <td style="width: 20%; height: 20%">
                <p>
                    @Html.DisplayFor(modelItem => item.Description)
                </p>
            </td>
            <td>                
                @Html.ActionLink("Delete", "Delete", new { id = item.Id })
            </td>
        </tr>
    }

</table>

控制器

          public ActionResult MyReviews(Guid? id) {
            id = new Guid(Session["LoggedUserID"].ToString());

            var review = db.Reviews.Where(m => m.CreatorId == id);

            return View(review.ToList());

        }

删除操作(我通过视图使用的地方)

       public ActionResult Delete(Guid? id) {
            if (id == null) {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Review review = db.Reviews.Find(id);
            if (review == null) {
                return HttpNotFound();
            }
            return View(review);
        }

    [HttpPost, ActionName("Delete")]
    [ValidateAntiForgeryToken]
    public ActionResult DeleteConfirmed(Guid id) {
        Review review = db.Reviews.Find(id);
        db.Reviews.Remove(review);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

2 个答案:

答案 0 :(得分:2)

如果您生成的页面专门用于从集合中删除项目,则为每个项目生成一个复选框并回发整个集合。

首先创建一个视图模型来表示您想要在视图中显示的内容

public class ReviewVM
{
    public Guid ID { get; set; }
    public string Title { get; set; }
    ... // other properties you want to display in the view
    public bool IsSelected { get; set; }
}

和GET方法

List<ReviewVM> model = db.Reviews.Where(m => m.CreatorId == id).Select(x => new ReviewVM
{
    ID = x.Id,
    Title = x.Title.
    ....
}).ToList();
return View(model);

在视图中

@model List<ReviewVM>
@Html.BeginForm())
{
    for (int i = 0; i < Model.Count; i++)
    {
        @Html.HiddenFor(m => m[i].ID)
        @Html.CheckBoxFor(m => m[i].IsSelected)
        @Html.DisplayFor(m => m[i].Title)
    }
    <input type="submit" .... />
}

和POST方法

[HttpPost]
public ActionResult MyReviews(List<ReviewVM> model)
{
    foreach (var review in Model)
    {
        if (review.IsSelected)
        {
            .... // delete the review based in the review.ID value

请注意,db.SaveChanges();只需要在结尾调用一次。由于用户已经删除了他们想要的所有评论,因此重定向到另一个视图似乎更适合返回当前视图。

另一方面,如果视图还包含用于编辑现有评论的链接,或者显示每个视图的更多详细信息,则使用ajax删除项目会更合适。有关典型实现,请参阅this answer

答案 1 :(得分:1)

我设法解决了这个问题:

为foreach-loop中的每个数据行添加复选框:

<input type="checkbox" class="chkCheckBoxId" value=@item.Id name="chkReviewId"/>

在视图中的某处添加按钮<input type="submit" value="Delete" onclick="return confirm('Are you sure?')"/>

在controll中添加:

        [HttpPost]
        public ActionResult MyReviews(FormCollection formCollection)
        {    
            string[] ids = formCollection["chkReviewId"].Split(new char[] {','});

            foreach (var id in ids)
            {
                var review = db.Reviews.Find(Guid.Parse(id));
                db.Reviews.Remove(review);
                db.SaveChanges();
            }    

            var description = db.Reviews.Where(m => m.Id == new Guid(Session["LoggedUserId"].ToString()));    
            return View(description.ToList());      
        }