ローカルドライブ情報をASP.NETでJSON文字列として出力する。 part.3
jQueryは数回しか使ったことがありませんが、何とか一応完成。
■ 気に入らない点
$.ajax の dataType を "json"
または
var json = eval(data); を var json = $.parseJSON(data);
にするとエラーになり1時間以上格闘しても、正しい書式が分からない為断念。
■ ソースコード (javascript)
var action_ajax = function (target, url) { // 対象のタグが存在していること、且つAjax通信中出ないこと if (target && (this.ajax !== true)) { // 多重送信防止用のフラグ this.ajax = true; var call_obj = this; $.ajax({ url: url , cache: false , dataType: "text" , success: function (data, status, xhr) { var json = eval(data); var html = '<table>'; html += '<tr>'; html += '<th>ドライブレター</th>'; html += '<th>容量</th>'; html += '<th>使用量</th>'; html += '<th>空き容量</th>'; html += '<th>比率</th>'; html += '</tr>'; for (var cnt = 0; cnt < json.length; cnt++) { var item = json[cnt]; html += '<tr>'; html += '<td>' + item.dl + '</td>'; html += '<td>' + item.s + '</td>'; html += '<td>' + item.ts + '</td>'; html += '<td>' + item.tfs + '</td>'; html += '<td>' + item.r + '</td>'; html += '</tr>'; } html += '</table>'; $(target).html(html); } , complete: function (xhr, status) { // 処理完了後は送信フラグをOFFにする。 call_obj.ajax = false; if (status != "success") { $(target).html("Ajaxエラー: " + status); } } }); } }
■ ソースコード (html)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <script type="text/javascript" src="js/jquery-1.7.1.min.js"></script> <script type="text/javascript" src="js/ajaxtest.js"></script> <title>Ajax Test</title> </head> <body> <h1>Ajax Test ページ</h1> <div> <p> <button onclick="action_ajax('#view', 'Default.aspx')">Action</button> </p> <span>View</span> <div id="view" style="border: 1px solid #000000;"> </div> </div> </body> </html>
■ ソースコード (aspx.cs)
using System; using System.IO; using System.Collections.Generic; using System.Diagnostics; using System.Web; using System.Web.Configuration; using System.Web.UI; using System.Text; namespace GetDiscSizeAjax { public partial class _Default : System.Web.UI.Page { private static List<DriveType> GetDriveTypes() { var dts = WebConfigurationManager.AppSettings["DriveTypes"]; if (string.IsNullOrEmpty(dts)) return null; var list = new List<DriveType>(); foreach(var str in dts.Split(',')){ DriveType? item = null; try { item = (DriveType)Enum.Parse(typeof(DriveType), str); } catch { } if (item.HasValue) { list.Add(item.Value); } } return list; } private static string GetDriveSize() { var sb = new StringBuilder(); var list = GetDriveTypes(); // 設定ファイルに設定がない場合はローカルディスクのみの情報を取得する。 if (list == null || list.Count <= 0) { list = new List<DriveType>(); list.Add(DriveType.Fixed); } sb.Append("{"); sb.Append("di:["); var loop = 0; var infos = DriveInfo.GetDrives(); foreach (var item in infos) { // HDDの種類でフィルタリングする if (list.Exists(x => x == item.DriveType)) { var a = new Decimal(item.TotalFreeSpace); var b = new Decimal(item.TotalSize); var c = (a / b) * 100; c = Decimal.Round(c, 2); // HDDの情報を設定 if (0 < loop) { sb.Append(","); } sb.Append("{"); sb.AppendFormat("dl:\"{0}\"", item.Name.Replace(":\\", "")); //DriveLetter sb.AppendFormat(",s:{0}", item.TotalSize); //Size sb.AppendFormat(",ts:{0}", (item.TotalSize - item.TotalFreeSpace)); //TotalSize sb.AppendFormat(",tfs:{0}", item.TotalFreeSpace); //TotalFreeSpace sb.AppendFormat(",r:{0}", c); //Rate sb.Append("}"); loop++; } } sb.Append("]"); sb.Append("}"); return sb.ToString(); } protected override void Render(HtmlTextWriter writer) { // 既存レンダリングをOFFにする。 //base.Render(writer); var str = ""; try { str = GetDriveSize(); } catch (Exception ex) { str = string.Format("{ErrorInfo:\"{0}\"}", ex.ToString()); } writer.Write(str); } } }
_