「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>ASP.NET MVCの利用方法]]

* 目次 [#s45f73d0]
#contents

*概要 [#f89c6a73]
[[ASP.NET MVC]]で[[Entity Framework]]をキャンセルした場合の選択肢として~
[[ASP.NET MVC]] + DataTableが必要なため、本項にコレを纏めた。

*通常の処理 [#wfdbf816]
**通常通りViewに持って行って処理可能。 [#b63d57a5]

-c# - Displaying standard DataTables in MVC - Stack Overflow~
http://stackoverflow.com/questions/2243898/displaying-standard-datatables-in-mvc

--[[ASP.NET MVC]]でDataTableの併用は問題ない。
 There is nothing about MVC that prevents you from using ADO.NET.

--以下は、
---「[[ASP.NET MVC]]でDataTableを使用するのがベストプラクティスでは無い。」と言っているのでは無くて、
---「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.

**ただし、双方向バインディング等は不可能 [#m91239fa]
単一レコードの処理を行う場合等はPOCOのViewModelを作成する。

*Grid系の処理 [#c93ef3ee]

**foreach [#z5b569b0]
foreach で処理可能。

**[[WebGrid>ASP.NET MVCのWebGrid]] [#v5946716]
[[WebGrid>ASP.NET MVCのWebGrid]]のコンストラクタの第一引数の~
sourceは、IEnumerableをサポートする必要があるので、~
DataTable使用時は、型の変換が必要がになるもよう。

***IEnumerable<DataRow> ではダメなケースがある。[#r2be74e6]
以下でIEnumerable<DataRow>に変換可能。

 var result = dt.AsEnumerable();

しかし、このresultは、

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

として使用できない。

理由は、

DataRowのpublic propertyが、

-RowError property
-HasError property

であるためのもよう。

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

-DataTableExtensions.AsEnumerable メソッド (DataTable) (System.Data)~
https://msdn.microsoft.com/ja-jp/library/system.data.datatableextensions.asenumerable.aspx
-WebGrid and DataTable | The ASP.NET Forums~
https://forums.asp.net/t/1673391.aspx?WebGrid%20and%20DataTable

この場合、
-[[以下のように、DataTableを、List<dynamic> に変換するか、>#qeaf6181]]
-grid.Column()メソッドで以下のように、formatを明示する、
 grid.Column("Name", format: (item) => item.Value["Name"].ToString()),
--なお、ここでHTMLヘルパーを使用するには、以下のように処理する。
---asp.net mvc 3 - how to format html helpers in webgrid column - Stack Overflow~
http://stackoverflow.com/questions/15158183/how-to-format-html-helpers-in-webgrid-column
 format: item => Html.TextBox((item) => item.Value["Name"].ToString())

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

***List<dynamic> に変換する。[#qeaf6181]
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);
 }

**ポストバック的な動作がある場合 [#k5d5c756]

***Sessionに格納しておく。 [#j8310e04]
削除しないとメモリを食う。

***Hidennに格納しておく。 [#mbcc3a3c]
Hiddenにバイナリ・シリアライズしたDataTableのBase64エンコーディングを保存。

***都度、DBから取得する。 [#zb981cbd]
オーバーヘッドがある。

*参考 [#obc5c62b]
-MVC Web Grid using Dynamic Data Table~
http://www.c-sharpcorner.com/code/2910/mvc-web-grid-using-dynamic-data-table.aspx

**Stack Overflow [#y8172bbe]
-c# - Displaying standard DataTables in MVC~
http://stackoverflow.com/questions/2243898/displaying-standard-datatables-in-mvc
-asp.net mvc 3 - Populate MVC Webgrid from DataTable~
http://stackoverflow.com/questions/6168548/populate-mvc-webgrid-from-datatable
-asp.net mvc 3 webgrid bound to List<dynamic> is exceedingly slow~
http://stackoverflow.com/questions/17322239/asp-net-mvc-3-webgrid-bound-to-listdynamic-is-exceedingly-slow

**[[AutoMapper]] [#x662f4d5]

----
Tags: [[:.NET開発]], [[:ASP.NET]], [[:ASP.NET MVC]], [[:ADO.NET]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS