1

我为针对 ASP.NET MVC 服务器的服务器端处理配置了一个 jQuery DataTable 。

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

似乎会引起一些架构摩擦,因为:

在初始页面呈现期间:

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

期间 AJAX 更新:

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

这里的重点是控制器现在被迫了解表格呈现布局,而它的职责应该仅限于传回 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 列表。如果控制器传回与 AJAX JSON 相同的 3 属性 DTO,则数据表会抱怨缺少列……数据表期望返回的 JSON 代表单元格元素,而不是源数据。

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

有没有其他选择?

4

1 回答 1

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]

于 2010-11-19T02:59:34.577 回答