2010-11-17 55 views
1

我有一個jQuery DataTable針對ASP.NET MVC服務器進行服務器端處理。在ASP.NET MVC中使用jQuery DataTable的正確AJAX模式是什麼?

要實現漸進式增強,將呈現HTML表,然後將其升級到DataTable。當DataTable進行AJAX調用以檢索更多數據時,它期望返回的JSON的元素與現有的表格列布局相關聯。

似乎導致一些建築摩擦,這是因爲:

在初始頁面渲染:

  • 該控制器將數據庫中的數據到的DTO,並建立ViewData的模型。
  • 的的ViewPage變換的ViewData模型轉換成HTML與的HtmlHelper的幫助等

Duriung AJAX更新:

  • 該控制器將數據庫中的數據爲表單元格數據,超鏈接等
  • DataTable將返回的數據直接渲染到表格單元格中。

的這裏的一點是,現在,控制器便被迫知道有關表呈現佈局,當它的責任應該限於傳回的DTO。

這是什麼正確模式?我如何支持AJAX調用並遵守控制器中的單一職責主體?


一些清晰:

我的DTO有三個屬性:

public class AccountListing 
{ 
    public int Id { get; set; } 
    public string AccountCode { get; set; } 
    public string AccountName { get; set; } 
} 

呈現的數據表有四列:

+--------------+--------------+------+------+ 
| Account Code | Account Name | View | Edit | 
+--------------+--------------+------+------+ 
| 12345  | FooBar Inc. | Link | Link | 
+--------------+--------------+------+------+ 

的的ViewPage呈現3財產DTO成4列表。 如果Controller返回與AJAX JSON相同的3個屬性DTO,則數據表會報告缺少的列...數據表預計返回的JSON表示單元元素,而不是源數據。

目前我正在解決這個問題,使用jQuery數組轉換和自定義表格渲染,這有效地複製了ViewPage的邏輯。

有沒有其他的選擇?

+0

ViewModel不是DTO,因此添加邏輯來創建鏈接。 – DarrellNorton 2010-12-06 18:30:12

+0

您可以使用https://github.com/mcintyre321/mvc.jquery.datatables執行此操作,請參閱wiki中的「自定義列呈現」 – mcintyre321 2016-07-26 09:04:40

回答

1

您目前的解決方案(在客戶端進行渲染)聽起來不錯。

問題是,您的DTO不必與您的視圖頁面顯示的內容相對應。流行的模式是有這些情況下的ViewModel對象。

例如:

public class AccountListingViewModel { 
    public string AccountCode { get; set; } 
    public string AccountName { get; set; } 
    public string ViewLink { get; set; } 
    public string EditLink { get; set; } 
    public static AccountListingViewModel FromAccountListing(AccountListing o) { 
     AccountListingViewModel returnObj = new AccountListingViewModel(); 
     //populate the properties from the parameter 
     return returnObj; 
    } 
} 

參見[viewmodel][model-view-viewmodel]

+0

添加行爲時,DTO(數據傳輸對象)不再是DTO。 ViewModel不是DTO,因此添加行爲很好,只是不要將它稱爲DTO。 – DarrellNorton 2010-12-06 18:27:46

相關問題