将jQuery DataTable与ASP.NET MVC一起使用的正确AJAX模式是什么?

时间:2010-11-17 05:47:41

标签: asp.net-mvc asp.net-ajax jquery-datatables

我有一个jQuery DataTable,用于针对ASP.NET MVC服务器进行服务器端处理。

要实现渐进式增强,将呈现HTML表格,然后升级到DataTable。当DataTable进行AJAX调用以检索更多数据时,它希望返回的JSON元素与现有的表 - 列布局相关联。

这个似乎导致一些架构摩擦,因为:

在初始页面呈现期间:

  • Controller将数据库数据转换为DTO并建立ViewData模型。
  • ViewPage借助HtmlHelper等将ViewData模型转换为HTML。

Duriung AJAX更新:

  • Controller将数据库数据转换为表格单元数据,具有超链接等
  • DataTable将返回的数据直接呈现到表格单元格中。

这里的要点是Controller现在被迫了解表格渲染布局,当它的责任应该仅限于传回DTO。

这里的正确的模式是什么?我如何支持AJAX调用并遵守控制器中的单一责任主体?


一些清晰度:

我的DTO有三个属性:

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

渲染的DataTable有四列:

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

ViewPage将3属性DTO呈现为4列表。 如果Controller传回与AJAX JSON相同的3个属性DTO,则数据表会抱怨缺少列...数据表期望返回的JSON表示单元格元素,而不是源数据。

目前我正在使用jQuery数组转换和自定义表格渲染来解决这个问题,这有效地复制了ViewPage的逻辑。

还有其他选择吗?

1 个答案:

答案 0 :(得分: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]