JavaScript共通機能の実装とjQuery EasyUIによるUI設計

日付フォーマット変換機能

JSONシリアライズにはNewtonsoft.Jsonライブラリを使用し、拡張メソッドを定義することで処理を簡素化しています。

public static class JsonExtensions
{
    public static string ToJson(this object instance)
    {
        return JsonConvert.SerializeObject(instance);
    }
}

データクエリとシリアライズの例:

var query = from a in db.TB_KTVAndConcert
            join b in db.TB_City on a.Cityid equals b.ID
            where a.AttributeCode == "AttrubuteCode".GetRequest()
            orderby a.Cityid
            select new
            {
                a.CreateDate,
                a.Defaultflag,
                a.ID,
                a.Name,
                a.Cityid,
                b.CityName,
                a.Displayindex
            };

if ("CityID".GetRequest().IsNotEmpty())
{
    if (MyRegex.IsNumberRegex("CityID".GetRequest()))
    {
        int cityId = Convert.ToInt32("CityID".GetRequest());
        query = query.Where(p => p.Cityid == cityId);
    }
}

context.Response.Write(query.OrderByDescending(p => p.Defaultflag)
                            .ThenBy(p => p.Displayindex)
                            .ToJson());

クライアント側日付フォーマット処理

日付データの表示を統一するため、JavaScriptで共通関数を実装しています。

Date.prototype.format = function(fmt) {
    if (!fmt) fmt = "yyyy-MM-dd hh:mm:ss";
    
    const o = {
        "M+": this.getMonth() + 1,
        "d+": this.getDate(),
        "h+": this.getHours(),
        "m+": this.getMinutes(),
        "s+": this.getSeconds(),
        "q+": Math.floor((this.getMonth() + 3) / 3),
        "S": this.getMilliseconds()
    };
    
    if (/(y+)/.test(fmt)) {
        fmt = fmt.replace(RegExp.$1, 
            (this.getFullYear()+"").substr(4 - RegExp.$1.length));
    }
    
    for (let k in o) {
        if (new RegExp("(" + k + ")").test(fmt)) {
            fmt = fmt.replace(RegExp.$1, 
                RegExp.$1.length == 1 ? o[k] : 
                ("00" + o[k]).substr((""+o[k]).length));
        }
    }
    
    return fmt;
};

function formatDate(str) {
    return new Date(parseInt(str.substring(
        str.indexOf('(')+1, 
        str.indexOf(')')
    ))).format("yyyy-MM-dd hh:mm:ss");
}

UI共通コンポーネント

メッセージ表示機能

function showMessage(title, msg, isAlert) {
    if (isAlert) {
        $.messager.alert(title, msg);
    } else {
        $.messager.show({
            title: title,
            msg: msg,
            showType: 'show'
        });
    }
}

確認ダイアログ

function showConfirmDialog(title, msg, callback) {
    $.messager.confirm(title, msg, function(result) {
        if (result && $.isFunction(callback)) {
            callback.call();
        }
    });
}

進捗表示機能

function showProgress(isShow, title, msg) {
    if (!isShow) {
        $.messager.progress('close');
        return;
    }
    
    $.messager.progress({
        title: title,
        msg: msg
    });
}

フォーム処理

フォーム送信時の共通処理:

function submitForm(url) {
    $('#ff').form('submit', {
        url: getUrl(url),
        onSubmit: function() {
            const isValid = $(this).form('validate');
            if (isValid) {
                showProgress(true, '処理中', 'データを送信しています...');
            }
            return isValid;
        },
        success: function(response) {
            showProgress(false);
            
            if (response === "1") {
                top.showMessage('成功', 'データを保存しました');
                
                if (parent !== undefined) {
                    if ($.isFunction(window.reloadParent)) {
                        reloadParent.call();
                    } else {
                        parent.$("#tt").datagrid('reload');
                        parent.closeWindow();
                    }
                }
            } else {
                $.messager.alert('エラー', response);
            }
        },
        onLoadError: function() {
            showProgress(false);
            $.messager.alert('エラー', '通信エラーが発生しました');
        }
    });
}

function getUrl(url) {
    return (url || "/Ajax/Common.ashx") + "?Type=" + typeCode;
}

ダイナミックウィンドウ

$(function() {
    $('body').append('<div id="appWindow" class="easyui-dialog" closed="true"></div>');
});

function openWindow(title, url, width, height, modal, minFlag, maxFlag) {
    $('#appWindow').window({
        title: title,
        width: width || 600,
        height: height || 400,
        content: `<iframe src="${url}" style="width:100%;height:98%" frameborder="0"></iframe>`,
        modal: modal !== undefined ? modal : true,
        minimizable: minFlag !== undefined ? minFlag : false,
        maximizable: maxFlag !== undefined ? maxFlag : false,
        shadow: false,
        cache: false,
        closed: false,
        collapsible: false,
        resizable: false,
        loadingMessage: 'データを読み込んでいます...'
    });
}

function closeWindow() {
    $('#appWindow').window('close');
}

HTMLフォームの例

<div class="easyui-layout" style="height:270px">
    <div region="center" style="padding:10px">
        <form id="ff" method="post">
            <input type="hidden" name="id">
            <table>
                <tr>
                    <td><label for="AdminLogin">ログイン名:</label></td>
                    <td>
                        <input class="easyui-validatebox" 
                               style="width:300px" 
                               type="text" 
                               required="true"
                               validtype="length[0,20]" 
                               name="AdminLogin">
                    </td>
                </tr>
                <tr>
                    <td><label for="RoleID">ロール:</label></td>
                    <td>
                        <input class="easyui-combobox" 
                               valuefield="ID" 
                               textfield="RoleName"
                               panelheight="auto"
                               editable="false" 
                               style="width:300px"
                               url="/Ajax/Common.ashx?Type=GetRoles"
                               required="true" 
                               name="RoleID">
                    </td>
                </tr>
            </table>
        </form>
    </div>
    <div region="south" style="text-align:right;padding:5px">
        <a class="easyui-linkbutton" 
           iconcls="icon-save" 
           href="javascript:void(0)" 
           onclick="submitForm()">保存</a>
    </div>
</div>

ページ更新処理

function reloadParentPage() {
    top.showProgress(false);
    parent.showMessage('成功', 'データを保存しました');
    parent.location.reload();
}

全コード例

// 日付フォーマット関数は前述のものと同じ

// メッセージ表示
function showMessage(title, msg, isAlert) {
    if (isAlert) {
        $.messager.alert(title, msg);
    } else {
        $.messager.show({
            title: title,
            msg: msg,
            showType: 'show'
        });
    }
}

// ウィンドウ関連
$(function() {
    $('body').append('<div id="appWindow" class="easyui-dialog" closed="true"></div>');
});

function openWindow(title, url, width, height, modal, minFlag, maxFlag) {
    $('#appWindow').window({
        title: title,
        width: width || 600,
        height: height || 400,
        content: `<iframe src="${url}" style="width:100%;height:98%" frameborder="0"></iframe>`,
        modal: modal !== undefined ? modal : true,
        minimizable: minFlag !== undefined ? minFlag : false,
        maximizable: maxFlag !== undefined ? maxFlag : false,
        shadow: false,
        cache: false,
        closed: false,
        collapsible: false,
        resizable: false,
        loadingMessage: 'データを読み込んでいます...'
    });
}

function closeWindow() {
    $('#appWindow').window('close');
}

// フォーム送信
function submitForm(url) {
    $('#ff').form('submit', {
        url: getUrl(url),
        onSubmit: function() {
            const isValid = $(this).form('validate');
            if (isValid) {
                showProgress(true, '処理中', 'データを送信しています...');
            }
            return isValid;
        },
        success: function(response) {
            showProgress(false);
            
            if (response === "1") {
                top.showMessage('成功', 'データを保存しました');
                
                if (parent !== undefined) {
                    if ($.isFunction(window.reloadParent)) {
                        reloadParent.call();
                    } else {
                        parent.$("#tt").datagrid('reload');
                        parent.closeWindow();
                    }
                }
            } else {
                $.messager.alert('エラー', response);
            }
        },
        onLoadError: function() {
            showProgress(false);
            $.messager.alert('エラー', '通信エラーが発生しました');
        }
    });
}

function getUrl(url) {
    return (url || "/Ajax/Common.ashx") + "?Type=" + typeCode;
}

// 進捗表示
function showProgress(isShow, title, msg) {
    if (!isShow) {
        $.messager.progress('close');
        return;
    }
    
    $.messager.progress({
        title: title,
        msg: msg
    });
}

// 確認ダイアログ
function showConfirmDialog(title, msg, callback) {
    $.messager.confirm(title, msg, function(result) {
        if (result && $.isFunction(callback)) {
            callback.call();
        }
    });
}

タグ: javascript jQuery jQuery-EasyUI Web-UI Form-Validation

6月24日 23:09 投稿