2012-04-13 90 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部分不僅僅是一個頁面,而是實際上由一些視圖組成的,這些視圖被搗毀成一個頁面。因此,單獨更新其中一個視圖並不會真正打破這種模式。