ASP.NET MVC 3 - 如何在离开View后执行代码?

时间:2012-04-13 16:58:00

标签: asp.net-mvc-3

我在这里遇到了一些麻烦。我认为公司可以竖起或缩小我们网站的用户。用户列在表格中,列具有公司投票或反对用户的小手图像。我在那里编写了ActionLink,但是,每次公司投票给用户时,我都不希望发生回发。

我决定用公司投票的用户ID填写一个列表,然后,当离开页面时,过滤器会拦截请求,获取列表并处理投票。在this post中,我学习了如何在调用Action时初始化Filter参数,但正如您所看到的,我需要一种方法让Filter在用户退出View时获取列表,而不是在Action中。

我不想使用代码隐藏,因为与MVC配对,这不是最佳做法,但回发也不是一种选择。

这是我到目前为止所拥有的:

public ActionResult ListUsers()
{
    // Create a List with user models and send it to a View,
    // which generates a WebGrid

    return View(userList);
}

public class PromoteUsersFilter : ActionFilterAttribute
{
    public int[] UsersToPromote { get; set; }
    public int[] UsersToScrewWith { get; set; }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        //insert promoting logic here
    }
}

我相信有一种简单的方法,因为大多数网站都有这种功能。任何人都可以指导我吗?

2 个答案:

答案 0 :(得分:3)

为什么不使用调用控制器方法的AJAX?如果正确设置了json,它仍然会被反序列化为一个对象。

据我所知,即使在MVC心态中也是如此。如果您需要保留数据,但不更新整个页面,这是我所知道的唯一方式。您甚至可以使用AJAX交换整个部分视图。

我认为这里常见的误解是视图部分(MVC)不仅仅是一个页面,而是实际上由一个页面中的一些视图组成。因此,单独更新其中一个视图并不能真正打破这种模式。

答案 1 :(得分:0)

绝对选择AJAX解决方案:

在您看来,它可能如下所示:

<div>
    <span class="cssUpvote" id="upvote"><span>
    <span class="cssDownvote" id="downvote"></span>
</div>

使用一些Jquery

<script>
   $(document).on('click', 'upvote', function (event) {

       $.ajax({
             type: 'POST',
             url: '/Votes/Upvote',
             data: { id: companyId }
       });
   });

   $(document).on('click', 'downvote', function (event) {

       $.ajax({
             type: 'POST',
             url: '/Votes/Downvote',
             data: { id: companyId }
       });
   });
</script>

然后你在Controller上的行动

[HttpPost]
public ActionResult Upvote(int id)
{
    //Do something with the (company)id
    return Json();
}

[HttpPost]
public ActionResult Downvote(int id)
{
    //Do something with the (company)id
    return Json();
}