ローカルドライブ情報を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;">
            &nbsp;
        </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);
        }
    }
}

_