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");
}
如果您生成的页面是专门用于从集合中删除项的,那么为每个项生成一个复选框,并发回整个集合。
首先创建一个视图模型来表示您想要在视图中显示的内容
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());
}