2012-04-13 88 views
1

我在这里遇到了一些麻烦。我有一种观点,公司可以对我们网站的用户进行赞誉或拒绝。用户被列在一个表格中,并且一列有小公司用来投票或反对用户的小手形象。我在那里编写了一个ActionLink,但是,我不希望每次公司对用户进行投票时发生回传。ASP.NET MVC 3 - 如何在离开视图后执行代码?

我决定用公司投票的用户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 
    } 
} 

我相信有这样做的一个简单的方法,因为大多数网站有这样的funcionality。任何人都可以用这个指导我吗?

+0

“当lea浏览页面“不是您可以在服务器上处理的事件。 “离开页面”可能会导致浏览器关闭,您将无法获得任何回报。使用AJAX。 – 2012-04-13 17:05:13

回答

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> 

然后你的控制器上的行动

[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(); 
} 
+0

我在我的StackOverflow帐户中进行了一些维护,发现当时我没有为这个问题选择正确的答案,所以我决定现在就做,因为这是我处理这些情况的方式自从。非常感谢你。 – 2014-02-27 22:28:03

3

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

就我所知,即使在MVC的心态中也是如此。如果你需要坚持你的数据,但不更新整个页面,这是我知道的唯一途径。您甚至可以使用AJAX替换整个部分视图。

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