2009-10-13 50 views
0

我有一個不錯的MVC應用程序現在運行,並且我添加了一些AJax功能。我有一個顯示10個項目的表格,只有某些用戶可以看到某些項目。當用戶添加新帖子時,我設置了ajax來保存新條目。然後我需要更新表,我無法從JQuery中發現用戶是什麼狀態(因此他們可以看到),所以我不能只插入一個新行(因爲一些用戶不能看到該行)。如果這是網絡表單,我可能會有一個轉儲表的頁面,然後我會使用JQuery將這個頁面的內容加載到當前頁面的相關插槽中。Asp.Net MVC Ajax和頁面的加載方面(查看)

用MVC實現這個最好的方法是什麼?

感謝

+1

你不能用一個類似[Authorize(Roles =「Admin」)]的授權標籤來修飾你的控制器動作。只有此角色的用戶才能插入該行。 JQuery可以調用控制器方法。 – Davy 2009-10-13 13:25:08

回答

1

正如@Robert Koritnik所建議的,處理這個問題的最好方法是使用PartialView。我建議有兩個單獨的控制器動作 - 一個處理原始請求,另一個處理AJAX新條目。這兩個操作都會調用相同的邏輯來獲取表格的數據。前者將數據與其他頁面數據一起放入視圖模型中。後者會將數據打包到局部視圖的模型中。

模型類

public class PageViewModel 
{ 
    .... 
    public IEnumerable<TableViewModel> TableData { get; set; } 
} 

public class TableViewModel 
{ 
    ... 
} 

控制器代碼

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Index() 
{ 
    var model = new PageViewModel(); 
    model.TableData = GetTableForUser(this.User); 

    return View(model); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult AddEntry(...) 
{ 
    ... add the new entry ... 
    var model = GetTableForUser(this.User); 

    return PartialView("TableView", model); 
} 


private TableViewModel GetTableForUser(IIdentity user) 
{ 
    ... 
} 

查看代碼

主視圖

<% Html.RenderPartial("TableView", model.TableData); %> 

<script type="text/javascript"> 
    $('#entryForm').submit(function() { 
     $.post('<%= Url.Action("addentry", "controller") %>', 
       $('#entryForm').serialize(), 
       function(data) { 
        $('#table').replaceWith(data); 
       }, 
       'html'); 
     return false; 
    }); 
</script> 

的TableView

<table id="table"> 
<% foreach (var row in Model) { %> 
    <tr> 
    ... 
    </tr> 
<% } %> 
</table> 
1

使用PartialView功能,將只返回<table>你的需要。在您的主頁中,它將被包含,但在您的Ajax調用中,它只會將HTML發送回客戶端,您可以使用它來替換現有的<table>元素。

+0

這似乎是我在找什麼。然而,我怎樣才能通過JQuery的AJAX添加一個局部視圖到頁面,每當我嘗試導航到一個局部視圖,我得到的404。 THanks – LiamB 2009-10-13 13:30:13

0

如果我正確理解你,你說的是用戶A正在查看條目列表,並且用戶B(在世界的其他地方也許)發佈了一個新條目。您希望用戶A屏幕上的列表進行更新,但只有當新條目是允許用戶A查看的條目時纔會更新?

如果是這種情況,可以在頁面上運行一個計時器,當計時器觸發時,它會引發一個AJAX調用服務器,詢問用戶是否有新條目。用戶的身份和 - 因此 - 他們可以看到哪些項目,應該從會話中確定(具體如何工作取決於您的特定架構,但我猜你已經這樣做了,以顯示用戶A使用的項目開始)

有各種細節考慮這裏......

  1. 應該多久定時器觸發,以獲得及時的更新,但沒有導致服務器流量太大
  2. 如果您只是更新整個列表(這會使代碼變得簡單),或者您應該只下載新的項目(這會使邏輯更加複雜,b ut也保持流量更小)
  3. 如何確保您正確識別用戶,並正確過濾條目以僅顯示相關條目。

這是一個相對簡單的場景 - 和那些沒有太罕見 - 但它需要以合理的方式來加以處理,以防止併發症設定

0

不難添加將存儲一個cookie用戶的當前狀態,或者您可以簡單地添加另一個Ajax調用來確定用戶是否已授權或不授權。您只需在您的控制器中創建一些項目以處理所有情況:無論用戶是授權用戶還是不用用戶,您顯示/隱藏了哪些內容。

你究竟需要什麼?