ASP.使用MultiSelect删除多行

本文关键字:删除 MultiSelect 使用 ASP | 更新日期: 2023-09-27 18:09:51

我想用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; }

View -列出所有已创建的评论

@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());
        }

删除动作(我使用via View)

       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");
    }

ASP.使用MultiSelect删除多行

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

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

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删除项将更合适。对于一个典型的实现,请参考这个答案。

我设法解决了这个问题:

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

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

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

添加到control:

        [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());      
        }