我需要一些帮助/建议如何使这项工作。 我需要通过ActionLink
将模型从视图传递给控制器@Html.ActionLink("Radera", "DeleteTraffic", new { model = Model, trafficId = traffic.Id }, new { @class = "btn btn-link NoBorder NoBackGround" })
控制器中的方法如下所示。
public ActionResult DeleteTraffic(CalendarModel model, int trafficId)
{
return View("EditDay", model);
}
我还没有在方法中添加任何代码,我只是在调试它以使调用工作。当我按下按钮时,model为null,但是正确设置了trafficId。那我做错了什么?
编辑1: 我根据这里的建议更改了代码。
@using (Html.BeginForm("DeleteTraffic", "Calendar", new {trafficId = traffic.Id})) {<input type="submit" value="Radera" class="btn btn-link NoBorder NoBackGround"/>}
[HttpPost]
[ValidateAntiForgeryToken]
[ActionName("DeleteTraffic")]
public ActionResult DeleteTraffic(int trafficId)
{
return View("EditDay", Model);
}
但永远不会重新使用DeleteTraffic,而是调用此页面的主要操作。
// GET: Calendar
public ActionResult Calendar()
{
CalendarModel model = new CalendarModel {SelectedDate = DateTime.Today};
if (Request.HttpMethod == "POST")
{
if (!string.IsNullOrEmpty(Request.Form.Get("submit.SelectDate")))
{
model.SelectedDate = Convert.ToDateTime(Request.Form["selectedDate"]);
model.TrafficDates = TrafficData.GeTrafficDatesPerMonth(model.SelectedDate);
Model = model;
return View("EditDay", Model);
}
}
Model = model;
return View(Model);
}
我应该将trafficId塞进一个隐藏的领域并将这个动作用于一切吗? MVC似乎有时不太灵活......
答案 0 :(得分:1)
首先,像“删除”这样的东西应该从不由GET处理。删除是原子的,应该使用POST或DELETE(最好)动词来完成。通常,您也不应该在没有用户确认的情况下删除某些内容,因此处理此问题的最简单和正确的方法是让“删除”链接将用户带到要求他们确认删除项目的视图。然后,在此视图中,您将通过表单帖子提交要删除的项目的ID:
public ActionResult Delete(int id)
{
var foo = db.Foos.Find(id);
if (foo == null)
{
return new HttpNotFoundResult();
}
return View(foo);
}
[HttpPost]
[ValidateAntiForgeryToken]
[ActionName("Delete")]
public ActionResult DeleteConfirm(int id)
{
var foo = db.Foos.Find(id);
if (foo == null)
{
return new HttpNotFoundResult();
}
db.Foos.Remove(foo);
db.SaveChanges();
return RedirectToAction("Index");
}
然后,对于您的GET操作,您将添加Delete.cshtml
文件:
@model Namespace.To.Foo
<p>Are you sure you want to delete the foo, "@Model.Name"?</p>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.HiddenFor(m => m.Id)
@Html.ActionLink("Cancel", "Index")
<button type="submit">Delete</button>
}
或者(或者更确切地说,因为您仍然应该使用以前的方法作为后备),如果您不想更改页面,可以使用JavaScript确认和AJAX来执行此操作:
@Html.ActionLink("Radera", "DeleteTraffic", new { id = item.Id }, new { @class = "btn btn-link NoBorder NoBackGround delete", data_id = item.Id })
然后:
<script>
$('.delete').on('click', function () {
var $deleteLink = $(this);
if (confirm('Are you sure?')) {
$.post('/url/for/delete/', { id = $deleteLink.data('id') }, function () {
$deleteLink.closest('tr').remove();
});
}
});
</script>