[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]] -[[戻る>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 で処理可能。 -c# - Displaying standard DataTables in MVC - Stack Overflow~ http://stackoverflow.com/questions/2243898/displaying-standard-datatables-in-mvc **[[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); } -参考 --MVC Web Grid using Dynamic Data Table~ http://www.c-sharpcorner.com/code/2910/mvc-web-grid-using-dynamic-data-table.aspx --asp.net mvc 3 - Populate MVC Webgrid from DataTable - Stack Overflow~ http://stackoverflow.com/questions/6168548/populate-mvc-webgrid-from-datatable --asp.net mvc 3 webgrid bound to List<dynamic> is exceedingly slow - Stack Overflow~ http://stackoverflow.com/questions/17322239/asp-net-mvc-3-webgrid-bound-to-listdynamic-is-exceedingly-slow **ポストバック的な動作がある場合 [#k5d5c756] ***Sessionに格納しておく。 [#j8310e04] 削除しないとメモリを食う。 ***Hidennに格納しておく。 [#mbcc3a3c] Hiddenにバイナリ・シリアライズしたDataTableのBase64エンコーディングを保存。 ***都度、DBから取得する。 [#zb981cbd] オーバーヘッドがある。 ---- Tags: [[:ASP.NET]], [[:ASP.NET MVC]], [[:ADO.NET]]