基于MVC+EasyUI的Web开发框架经验总结(12)--利用Jquery处理数据交互的几种方式

在基于MVC+EasyUI的Web开发框架里面,大量采用了Jquery的方法,对数据进行请求或者提交,方便页面和服务器后端进行数据的交互处理。本文主要介绍利用Jquery处理数据交互的几种方式,包括获取数据并显示,插入新数据到服务器,更新数据,删除数据等操作。

1、利用Jquery获取数据并显示

为了顺利获取数据,我们需要保持页面端调用和服务器端保持一致,并相应的把数据转换或者封装为对象实体进行处理。
下面我们以一个简单的全国省份、全国城市、全国城市行政区的案例进行Demo代码的介绍。




总体的操作包括了,分页查询,添加数据的保存,编辑显示和保存,查看信息的数据显示等等,而利用Jquery获取数据并绑定到界面控件上的代码操作如下所示,主要就是利用getJson方法进行处理。
//绑定编辑详细信息的方法
function BindEditInfo(ID) {
    //使用同步方式,使得联动的控件正常显示
    $.ajaxSettings.async = false;
    //首先用户发送一个异步请求去后台实现方法
    $.getJSON("/Province/FindByID?id=" + ID, function (info) {
    //赋值有几种方式:.datebox('setValue', info.Birthday);.combobox('setValue', info.Status);.val(info.Name);.combotree('setValue', info.PID);.numberbox('setValue', info.Number);
        $("#ID").val(info.ID);
        $("#ProvinceName").val(info.ProvinceName);

        isAddOrEdit = 'edit';//新增对话框标识    
    });
}

//绑定查看详细信息的方法
function BindViewInfo(ID) {          
    //发送请求
    $.getJSON("/Province/FindByID?id=" + ID, function (info) {
        $("#ID2").text(info.ID);
        $("#ProvinceName2").text(info.ProvinceName);
    });
}

getJson方法主要就是调用MVC里面控制器的方法,获取数据,并把它转换为Json的对象实体,这样我们就能方便获取到对应的属性,从而绑定到界面控件。而FindByID的接口是控制器里面的方法定义,我们可以通过下面的控制器基类代码了解具体的逻辑。

/// <summary>
/// 查询数据库,检查是否存在指定ID的对象
/// </summary>
/// <param name="id">对象的ID值</param>
/// <returns>存在则返回指定的对象,否则返回Null</returns>
public virtual ActionResult FindByID(string id)
{
    //检查用户是否有权限,否则抛出MyDenyAccessException异常
    base.CheckAuthorized(AuthorizeKey.ViewKey);

    ActionResult result = Content("");
    T info = baseBLL.FindByID(id);
    if (info != null)
    {
        result = ToJsonContentDate(info);
    }

    return result;
}
/// <summary>
/// 返回处理过的时间的Json字符串
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
public ContentResult ToJsonContentDate(object date)
{
    var timeConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" };
    return Content(JsonConvert.SerializeObject(date, Formatting.Indented, timeConverter));
}

2、利用Jquery保存数据到服务器

上面的操作是从服务端获取数据并显示在页面上,下面我们来介绍如何把数据通过通过Jquery调用,保存到服务器上。

在Web框架里面,我们把添加数据和编辑数据的界面,共享了一个层的界面代码,这样可以减少主界面视图Index.cshtml的代码数量(因为我们把各种界面的代码放在一个文件里面,方便操作管理)。

<!--------------------------添加/修改信息的弹出层---------------------------->
<div id="DivAdd" class="easyui-dialog" style="width:680px;height:200px;padding:10px 20px"
    closed="true" resizable="true" modal="true" data-options="iconCls: 'icon-add',buttons: '#dlg-buttons'">
<form id="ffAdd" method="post" novalidate="novalidate">
    <div id="tabAdd" class="easyui-tabs" >
        <div title="基本信息" data-options="iconCls:'icon-view'"  style="padding:5px 5px">
            <table>
                <tr>
                    <td>                    
                        <table id="tblAdd1" class="view">
                            <tr> 
                                <th>
                                    <label for="ProvinceName">省份名称:</label>
                                </th>
                                <td colspan="3">
                                    <input class="easyui-validatebox" type="text" id="ProvinceName" name="ProvinceName" style="width:280px;"  />
                                </td>

                            </tr>
                         </table>
                    </td>
                </tr>
            </table>
        </div>
    </div>
    <div style="text-align:right; padding-top:10px">
        <input type="hidden" id="ID" name="ID" />
        <a href="javascript:void(0)" class="easyui-linkbutton" id="btnAddOK" iconcls="icon-ok" onclick="SaveEntity()">确定</a>
        <a href="javascript:void(0)" class="easyui-linkbutton" iconcls="icon-cancel" onclick="javascript:$('#DivAdd').dialog('close')">关闭</a>
    </div>
 </form>
</div>

而数据的保存,我们也用同一个函数,这样也很方便,同时减少代码数量,保存操作的javascript脚本函数如下所示。

//绑定添加按钮的事件
function SaveEntity() {
    //判断表单的信息是否通过验证
    var validate = $("#ffAdd").form('validate');
    if (validate == false) {
        return false;
    }

    var postData = $("#ffAdd").serializeArray();
    $.post(url, postData, function (json) {
        var data = $.parseJSON(json);
        if (data.Success) {
            //添加成功  1.关闭弹出层,2.刷新DataGird
            showTips("保存成功");
            $("#DivAdd").dialog("close");
            $("#grid").datagrid("reload");
            $("#ffAdd").form("clear");
        }
        else {
            showError("保存失败:" + data.ErrorMessage, 3000);
        }
    }).error(function () {
        $.messager.alert("提示", "您未被授权使用该功能,请联系管理员进行处理。", 'warning');
    });
}

由于每个层都定义了Name和ID,因此我们可以很容易通过下面方式获取到对应的对象数据,方便提交。

var postData = $("#ffAdd").serializeArray();

插入数据的时候,调用的路径如下所示:

url = '/Province/Insert';

更新数据的时候,调用的路径如下数艘:

url = '/Province/Update?ID=' + ID;

插入对象到数据库里面的控制器方法,主要还是调用BLL层的对象方法进行处理,不过事先会进行一定的权限控制和信息补充,如下代码所示。

/// <summary>
/// 插入指定对象到数据库中
/// </summary>
/// <param name="info">指定的对象</param>
/// <returns>执行操作是否成功。</returns>
public virtual ActionResult Insert(T info)
{
    //检查用户是否有权限,否则抛出MyDenyAccessException异常
    base.CheckAuthorized(AuthorizeKey.InsertKey);

    CommonResult result = new CommonResult();
    if (info != null)
    {
        try
        {
            OnBeforeInsert(info);
            result.Success = baseBLL.Insert(info);
        }
        catch(Exception ex)
        {
            LogTextHelper.Error(ex);//错误记录
            result.ErrorMessage = ex.Message;
        }
    }
    return ToJsonContent(result);
}

我们注意到,插入和更新操作,返回的对象都是 **CommonResult **对象,这个对象,包含了一个Success的布尔属性,用来表示是否成功,还有一个ErrorMessage属性,用来标识错误信息的,所以我们利用Javascript脚本处理保存操作的时候,也需要使用这两个属性,用来区分和提示信息的显示。

var data = $.parseJSON(json);
if (data.Success) {
    //添加成功  1.关闭弹出层,2.刷新DataGird
    showTips("保存成功");
    $("#DivAdd").dialog("close");
    $("#grid").datagrid("reload");
    $("#ffAdd").form("clear");
}
else {
    showError("保存失败:" + data.ErrorMessage, 3000);
}

操作完成后,提示成功的信息如下所示。


3、利用Jquery删除列表数据操作

利用Jquery函数,可以POST删除的请求到服务器上,在此之前我们需要了解我们需要删除那些记录,并确认提示是否删除,删除成功后,更新列表,并提示用户,大致的页面代码函数如下所示。

//实现删除数据的方法
function Delete() {
//得到用户选择的数据的ID
var rows = $("#grid").datagrid("getSelections");
if (rows.length >= 1) {
    //遍历出用户选择的数据的信息,这就是用户用户选择删除的用户ID的信息
    var ids = "";   //1,2,3,4,5
    for (var i = 0; i < rows.length; i++) {
        ids += rows[i].ID + ",";
    }
    //最后去掉最后的那一个,
    ids = ids.substring(0, ids.length - 1);
    var postData = { Ids: ids };

    //然后确认发送异步请求的信息到后台删除数据
    $.messager.confirm("删除确认", "您确认删除选定的记录吗?", function (action) {
        if (action) {
            $.ajax({
                type: 'POST',
                url: '/District/DeletebyIds',
                dataType: 'json',
                data: postData,
                success: function (data) {
                    if (data.Success) {
                        showTips("删除选定的记录成功");

                        $("#grid").datagrid("reload");
                        //当删除完成之后,第二次删除的时候还记得上次的信息,这样是不可以的,所以我们需要清除第一次的信息                                
                        rows.length = "";//第一种方法                                
                        $("#grid").datagrid("clearSelections");//第二种方法
                    }
                    else {
                        showError("操作失败:" + data.ErrorMessage, 3000);
                    }
                }
            });
        }
    });
}
else {
    $.messager.alert("提示", "请选择你要删除的数据");
}
}

而服务器的MVC控制器类,我们也只需要调用基类控制器方法就可以了,基本上不需要额外的处理代码。

MVC控制器基类的方法定义如下所示,注意最后返回的是一个常见类CommonResult ,承载这个是否操作成功和错误信息(如果存在的话)。

/// <summary>
/// 删除多个ID的记录
/// </summary>
/// <param name="ids">多个id组合,逗号分开(1,2,3,4,5)</param>
/// <returns></returns>
public virtual ActionResult DeleteByIds(string ids)
{
    //检查用户是否有权限,否则抛出MyDenyAccessException异常
    base.CheckAuthorized(AuthorizeKey.DeleteKey);

    CommonResult result = new CommonResult();
    try
    {
        if (!string.IsNullOrEmpty(ids))
        {
            List<string> idArray = ids.ToDelimitedList<string>(",");
            foreach (string strId in idArray)
            {
                if (!string.IsNullOrEmpty(strId))
                {
                    baseBLL.Delete(strId);
                }
            }
            result.Success = true;
        }
    }
    catch (Exception ex)
    {
        LogTextHelper.Error(ex);//错误记录
        result.ErrorMessage = ex.Message;
    }
    return ToJsonContent(result);
} 

城市信息界面如下所示。




行政区管理界面如下所示。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容