我希望使用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");
}
答案 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());
}