代码之家  ›  专栏  ›  技术社区  ›  Mark

在ASP.NET MVC中使用jQuery数据表的正确AJAX模式是什么?

  •  1
  • Mark  · 技术社区  · 14 年前

    我有个jQuery DataTable 配置为针对ASP.NET MVC服务器进行服务器端处理。

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

    这个 似乎 引起一些建筑摩擦,因为:

    在初始页面呈现期间:

    • 控制器将数据库数据转换为DTO并建立ViewData模型。
    • ViewPage在HtmlHelper等的帮助下将ViewData模型转换成HTML。

    在AJAX更新期间:

    • 控制器通过超链接等将数据库数据转换为表单元数据。
    • data table将返回的数据直接呈现到表单元格中。

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

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

    还有别的选择吗?

    1 回复  |  直到 11 年前
        1
  •  1
  •   Community CDub    8 年前

    你目前的解决方案(在客户端进行渲染)听起来不错。

    问题是,您的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] .