Asp.net MVC 5通过ActionLink将模型对象传递给控制器

时间:2016-06-16 13:09:15

标签: asp.net-mvc-5

我需要一些帮助/建议如何使这项工作。 我需要通过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似乎有时不太灵活......

1 个答案:

答案 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>