ASP.NET MVC and jqGrid 学习笔记 5-添加数据

据介绍,jqgrid有3种编辑数据的方式:

  1. Cell Editing 只允许修改某一个单元格内容
  2. Inline Editing 允许在jqGrid中直接修改某一行的数据
  3. Form Editing 弹出一个新的编辑窗口进行编辑和新增

Form Editing很方便,直接把oper参数传递给Controller进行判断是add还是edit还是del,然后相应处理即可。大致如:

string operation = form["oper"];
if (operation.Equals("add")){...}
else if (operation.Equals("edit")){...}
else if (operation == "del"){...}

当然前端的配置要跟上:

<script type="text/javascript">
    $(function () {
        $("#grid").jqGrid({...});
        $("#grid").jqGrid('navGrid', '#pager', { edit: true, add: true, del: true, search: true },
        {...},//Edit
        {...},//Add
        {...},//Delete
        {...} //Search
        );
    });
</script>

这样会调用jqgrid内置的窗体来进行CRUD。如果不喜欢内置的对话框格式,我们可以自定义。本文介绍的就是自定义对话框的方法。

先看下效果图

这里的创建新联系人对话框就是自定义的,步骤如下:

一、View

1、html-设计自己的对话框

<button onclick="addDialog()">添加联系人</button>

<table id="grid"></table>
<div id="pager"></div>
<div id="myDialog">
    <form id="myForm">
    Name:<input type="text" id="Name" name="Name" /><br />
    Email:<input type="text" id="Email" name="Email" /><br />
    Created On:<input type="text" id="CreatedOn" name="CreatedOn" />
    </form>
</div>

2、javascript:

包含3部分

  1. jqgrid设置
  2. 对话框的配置
  3. 添加动作的代码
 1 <script type="text/javascript">
 2     $(function () {
 3         jQuery("#grid").jqGrid({
 4             url: "/Home/GetSortingData",
 5             datatype: "json",
 6             mtype: "get",
 7             colModel: [
 8                 { label: 'Number', name: 'No', index: 'No', width: 60, sorttype: "int" },
 9                 { label: 'Name', name: 'Name', index: 'Name', width: 90 },
10                 { label: 'Email', name: 'Email', index: 'Email', width: 100, sortable: false },
11                 {
12                     label: 'Created On', name: 'CreatedOn', index: 'CreatedOn', width: 150,
13                     formatter: 'date', formatoptions: { srcformat: 'Y-m-d H:i:s', newformat: 'Y-m-d H:i:s' }
14                 }
15             ],
16             caption: "jqGrid data",
17             loadonce: false,    //排序翻页等操作在服务端完成
18             rowNum: 5,
19             rowList: [5, 10, 20],  //设置分页下拉列表
20             pager: "#pager",
21             viewrecords: true,
22             width: 500, height: "auto",
23             jsonReader: { repeatitems: false }, //prmNames: { id: "No" },
24             sortorder: "asc",
25             sortname: "No"//传递给服务端的排序字段名
26         });
27         // 配置对话框(使用Jquery-UI的dialog插件)  
28         $("#myDialog").dialog({
29             autoOpen: false,
30             modal: false,    // 设置对话框为非模态对话框  
31             resizable: true,
32             width: 250,
33             buttons: {  // 为对话框添加按钮  
34                 "取消": function () { $(this).dialog("close") },
35                 "创建": add
36             }
37         });
38     });
39     //添加-对话框
40     var addDialog = function () {
41         var dlg = $("#myDialog");
42         var btnPane = dlg.siblings(".ui-dialog-buttonpane"); //注释1
43         dlg.find("input").removeAttr("disabled").val("");
44         btnPane.find("button:not(:contains('取消'))").hide(); //注释2
45         btnPane.find("button:contains('创建')").show();
46         dlg.dialog("option", "title", "创建新联系人").dialog("open");
47     };
48     //添加-函数表达式
49     var add = function () {
50         var dlg = $("#myDialog");
51         var name = $.trim(dlg.find("#Name").val());
52         var email = $.trim(dlg.find("#Email").val());
53         var createdOn = $.trim(dlg.find("#CreatedOn").val());
54 
55         var actionUrl = "/Home/OperateData";
56         var params = {
57             "Name": name,
58             "Email": email,
59             "CreatedOn": createdOn
60         };
61 
62         $.ajax({
63             url: actionUrl,
64             type: "post",   //默认为get
65             data: params,   //传递给服务端的数据
66             dataType: "json",
67             cache: false,
68             error: function (textStatus, errorThrown) {
69                 alert("系统ajax交互错误: " + textStatus);
70             },
71             success: function (data, textStatus) {
72                 if (data.success == true) {//注释3
73                     var dataRow = {       //注释4
74                         No: data.No,   
75                         Name: name,
76                         Email: email,
77                         CreatedOn: createdOn
78                     };
79                     var selectedId = $("#grid").jqGrid("getGridParam", "selrow");
80 
81                     if (selectedId) {
82                         $("#grid").jqGrid("addRowData", data.No, dataRow, "before", selectedId);//如果有选定行则添加在选定行前面
83                     } else {
84                         $("#grid").jqGrid("addRowData", data.No, dataRow, "first");//没有选定行则添加在第一行
85                     }
86                     dlg.dialog("close");
87                     alert("联系人添加操作成功!");
88                 } else {
89                     alert("添加操作失败!");
90                 }
91             }
92         });
93     };
94 </script>

以上代码有4个注释

注释1:

 var btnPane = dlg.siblings(".ui-dialog-buttonpane");

我们知道siblings() 是获得匹配集合中每个元素的同胞,那么".ui-dialog-buttonpane"是个什么类?

由此可见,通过我们自定义的myDialog找到了我们添加的2个按钮所在的面板,这个面板就包含一个.ui-dialog-buttonpane的css类。找到这个类主要就是便于操作我们设计的用于增删改查的按钮。

注释2:

btnPane.find("button:not(:contains('取消'))").hide(); //注释2

:contains 选择器选取包含指定字符串的元素,该字符串可以是直接包含在元素中的文本,或者被包含于子元素中。

在按钮面板中查找不包含"取消"的元素,找到后把他们隐藏起来(这个对话框中后面还要添加其他按钮,根据增删改查的需要来显示和隐藏。现在可忽略。)

注释3:

 if (data.success == true) {//注释3

success是什么?哪里来的?

在回调函数中,有一句success: function (data, textStatus) ,这里的data是响应服务端的数据,这个data包含了从服务端传来的信息。这个信息是从Controller传来的,完整代码见Controller部分,这里只看这个data的部分:

return Json(new 
{ 
    success = true, 
    msg = "hahah" ,
    No=member.No    //返回给前端序号
});    

 这个json对象就传递给了前端,success = true就是这么来的。

注释4:

 var dataRow = {       //注释4
                 No: data.No,   
                 Name: name,
                 Email: email,
                 CreatedOn: createdOn
               };

 这是一个数组,包含了自定义对话框中的各个文本框的值,通过jqgrid的addRowData方法,在客户端操作jqgrid。

 $("#grid").jqGrid("addRowData", data.No, dataRow, "first");

二、Controller

    public ActionResult CRUD()
        {
            return View();
        }
        public ActionResult OperateData(Member m) 
        {
            Member member = new Member();
            member.No = m.No;
            member.Name = m.Name;
            member.Email = m.Email;
            member.CreatedOn = m.CreatedOn;

            MyContext db = new MyContext();
            db.Members.Add(member);
            db.SaveChanges();
            return Json(new 
            { 
                success = true, 
                msg = "hahah" ,
                No=member.No    //返回给前端序号
            });           
        }

--End--

 

posted @ 2013-12-23 11:29  ibg  阅读(1084)  评论(3编辑  收藏  举报