1

ASP.NET MVC サーバーに対するサーバー側処理用に構成された jQuery DataTableがあります。

プログレッシブ エンハンスメントを実現するために、HTML テーブルがレンダリングされてから、DataTable にアップグレードされます。DataTable は、より多くのデータを取得するために AJAX 呼び出しを行うとき、返された JSON の要素が既存のテーブルと列のレイアウトと関連付けられることを期待します。

これにより、次の理由により、アーキテクチャ上の摩擦が発生するようです。

最初のページのレンダリング中:

  • Controller は、データベース データを DTO に変換し、ViewData モデルを確立します。
  • ViewPage は、HtmlHelper などを使用して ViewData モデルを HTML に変換します。

AJAX 更新中:

  • コントローラーは、ハイパーリンクなどを使用して、データベース データをテーブル セル データに変換します。
  • DataTable は、返されたデータをテーブル セルに直接レンダリングします。

ここでのポイントは、コントローラーの責任がDTO を返すことに限定されている場合に、コントローラーがテーブル レンダリング レイアウトを知ることを余儀なくされていることです。

ここで正しいパターンは何ですか?AJAX 呼び出しをサポートし、コントローラーの単一責任プリンシパルに準拠するにはどうすればよいですか?


いくつかの明確さ:

私の DTO には 3 つのプロパティがあります。

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

レンダリングされた DataTable には 4 つの列があります。

+--------------+--------------+------+------+
| 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 に答える