マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

ASP.NET MVCEntity Frameworkをキャンセルした場合の選択肢として
ASP.NET MVC + DataTable?が必要なため、本項にコレを纏めた。

通常の処理

通常通りViewに持って行って処理可能。

  • ASP.NET MVCDataTable?の併用は問題ない。
    There is nothing about MVC that prevents you from using ADO.NET.
  • 以下は、
    • ASP.NET MVCDataTable?を使用するのがベストプラクティスでは無い。」と言っているのでは無くて、
    • 「Controllerでデータを作成するのがベストプラクティスでは無い。」と言っているので、

お間違いなきよう。

Now, I'm violating a whole lot of principles and "best-practices" of ASP.NET MVC here, so please understand this is just a simple demonstration.

ただし、双方向バインディング等は不可能

単一レコードの処理を行う場合等はPOCOのViewModel?を作成する。

Grid系の処理

foreach

foreach で処理可能。

WebGrid

WebGridのコンストラクタの第一引数の
sourceは、IEnumerableをサポートする必要があるので、
DataTable?使用時は、型の変換が必要がになるもよう。

IEnumerable<DataRow?> ではダメなケースがある。

以下でIEnumerable<DataRow?>に変換可能。

var result = dt.AsEnumerable();

しかし、このresultは、

@{
  ・・・
  var grid = new WebGrid(erc);
  ・・・
}
・・・
@grid.GetHtml()
・・・

として使用できない。

理由は、

DataRow?のpublic propertyが、

  • RowError? property
  • HasError? property

であるためのもよう。

詳しくは、下記を参照のこと。

この場合、

と、イイ感じに処理できるもよう。

List<dynamic> に変換する。

List<dynamic>に、(IDictionary<string, object>) ExpandoObject?を追加していく。

var result = new List<dynamic>();
foreach (DataRow row in table.Rows)
{
  var obj = (IDictionary<string, object>)new ExpandoObject();
  foreach (DataColumn col in table.Columns)
  {
    obj.Add(col.ColumnName, row[col.ColumnName]);
  }
  result.Add(obj);
}

ポストバック的な動作がある場合

Sessionに格納しておく。

削除しないとメモリを食う。

Hidennに格納しておく。

Hiddenにバイナリ・シリアライズしたDataTable?のBase64エンコーディングを保存。

都度、DBから取得する。

オーバーヘッドがある。

参考

Stack Overflow

AutoMapper


Tags: :.NET開発, :ASP.NET, :ASP.NET MVC, :ADO.NET


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-07-04 (水) 09:16:54 (11d)