zoukankan      html  css  js  c++  java
  • ASP.NET MVC and jqGrid 学习笔记 6-增删改操作

    程序结构:

    1. Member.cs
    2. CRUD.cshtml
    3. CRUD.js
    4. HomeController

    一、Model

    public class Member
        {
            [Key]
            public int No { get; set; }
    
            [Required(ErrorMessage="姓名必填")]
            [StringLength(5,ErrorMessage="不能超过5个字")]
            public string Name { get; set; }
    
            [MaxLength(200)]
            public string Email { get; set; }
    
            public DateTime? Birthday { get; set; }
    
            [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
            public DateTime? CreatedOn { get; set; }
    
            //导航属性
            public ICollection<Guestbook> Guestbooks { get; set; }
    
        }

    二、View

    在view中把javascript代码移到了一个单独的js文件里,然后在html里引入该文件,这样似乎更清晰些。

    CRUD.cshtml:

    @model HelloJqGrid.Models.Member
    
    @{
        ViewBag.Title = "CRUD";
    }
    <script type="text/javascript" src="~/ViewJs/CRUD.js"></script>
    
    <h2>CRUD</h2> <button onclick="openDialog('添加')">添加</button> <button onclick="openDialog('删除')">删除</button> <button onclick="openDialog('更改')">更改</button> <table id="grid"></table> <div id="pager"></div> <div id="myDialog"> <form id="myForm"> <div> <label>Your name:</label> @Html.EditorFor(model => model.Name) @Html.ValidationMessageFor(model => model.Name) </div> <div> <label>Your email:</label> @Html.EditorFor(model => model.Email) @Html.ValidationMessageFor(model => model.Email) </div> <div> <label>Birthday:</label> @Html.EditorFor(model => model.Birthday) @Html.ValidationMessageFor(model => model.Birthday) </div> </form> </div> @section Scripts{@Scripts.Render("~/bundles/jqueryval")}

    注意最后一行@section Scripts{@Scripts.Render("~/bundles/jqueryval")} 这个是ASP.NET MVC用于数据验证的。

    在这里用的是html helper(html辅助方法),辅助方法会自动带上数据验证,验证的错误信息来着于model中的属性标签。这种方法要引用jqueryval(bundle)。

      bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                            "~/Scripts/jquery.unobtrusive*",
                            "~/Scripts/jquery.validate*"));

    可以看到是微软在jquery.validate.js的基础上的改进的客户端验证。

    CRUD.js:

    包含有jqGrid的配置,Dialog的配置,增删改的操作。

    $(function () {
        //配置jqGrid
        jQuery("#grid").jqGrid({
            url: "/Home/GetSortingData",
            datatype: "json",
            mtype: "get",
            colModel: [
                { label: 'Number', name: 'No', index: 'No',  60, sorttype: "int" },
                { label: 'Name', name: 'Name', index: 'Name',  90 },
                { label: 'Email', name: 'Email', index: 'Email',  100, sortable: false },
                {
                    label: 'Birthday', name: 'Birthday', index: 'Birthday',  100,
                    formatter: 'date', formatoptions: { srcformat: 'Y-m-d', newformat: 'Y-m-d' },
                    editable: true, editrules: { required: true }
                },
                {
                    label: 'Created On', name: 'CreatedOn', index: 'CreatedOn',  150,
                    formatter: 'date', formatoptions: { srcformat: 'Y-m-d H:i:s', newformat: 'Y-m-d H:i:s' }
                }
            ],
            caption: "jqGrid data",
            loadonce: false,    //排序翻页等操作在服务端完成
            rowNum: 5,
            rowList: [5, 10, 20],  //设置分页下拉列表
            pager: "#pager",
            viewrecords: true,
             500, height: "auto",
            jsonReader: { repeatitems: false }, //prmNames: { id: "No" },
            sortorder: "asc",
            sortname: "No"//传递给服务端的排序字段名
        });
        //配置对话框(使用Jquery-UI的dialog插件)  
        $("#myDialog").dialog({
            autoOpen: false,
            modal: false,    // 设置对话框为非模态对话框  
            resizable: true,
             250,
            buttons: {  // 为对话框添加按钮  
                "取消": function () { $(this).dialog("close") },
                "创建": function (event) { operate(event); },//add,     
                "删除": function (event) { operate(event); },//del,     
                "更改": function (event) { operate(event); }//update    
            }
        });
        //选择日期
        $("#Birthday").datepicker();
        $("#ui-datepicker-div").css('font-size', '0.9em'); //改变大小
    });
    
    //操作对话框
    function openDialog(btnName) {
        var dlg = $("#myDialog");
        var btnPane = dlg.siblings(".ui-dialog-buttonpane");
    
        if (btnName == "添加") {
            dlg.find("input").removeAttr("disabled").val("");
            dlg.dialog("option", "title", "创建").dialog("open");
            btnPane.find("button:not(:contains('取消'))").hide();
            btnPane.find("button:contains('创建')").show();
        }
        else if (btnName == "更改") {
            dlg.find("input").removeAttr("disabled");
            dlg.dialog('option', 'title', '更改');
            btnPane.find("button:not(:contains('取消'))").hide();
            btnPane.find("button:contains('更改')").show();
            loadSelectedRowData();//载入选中行数据
        }
        else if (btnName == "删除") {
            dlg.find("input").attr("disabled", true);
            dlg.dialog("option", "title", "删除");
            btnPane.find("button:not(:contains('取消'))").hide();
            btnPane.find("button:contains('删除')").show();
            loadSelectedRowData();//载入选中行数据
        }
    }
    
    //载入选中行数据
    function loadSelectedRowData() {
        var grid = $("#grid");
        var id = grid.jqGrid("getGridParam", "selrow");
        var no = grid.jqGrid("getRowData", id).No;
        if (!id) {
            alert("请先选择要编辑的行"); return false;//退出
        } else {
            var params = { "No": no };
            //虽然用rowData可以获得各字段的值,但是这是在客户端操作;var rowData = grid.jqGrid("getRowData", id);
            //为避免数据已被改动,从数据库里读出对应编号的数据较好;
            $.ajax({
                url: '/Home/GetRowData',
                //type: 'POST',
                data: params,
                dataType: 'json',
                cache: false,
                error: function (jqXHR, textStatus, errorThrown) { alert("status:" + jqXHR.status + "
    StatusText:" + jqXHR.statusText); },
                success: function (data, textStatus, jqXHR) {//这里的data是接收服务端的数据
                    var dlg = $("#myDialog");
                    dlg.find("#No").val(data.No);
                    dlg.find("#Name").val(data.Name);
                    dlg.find("#Email").val(data.Email);
    
                    //--日期字段需要特别处理一下
                    //--return Json:显示"/Date(1387712653000)/"
                    //--Newtonsoft:2013-12-22T19:12:54
                    //--第一种方式:
                    //--var jsonDate = data.CreatedOn;
                    //--var mydate = new Date(parseInt(jsonDate.substr(6))); //结果为1387712653000 |Sun Dec 22 2013 19:38:03 GMT+0800              
                    //--var a = (new Date(mydate)).toLocaleDateString() + " " + (new Date(mydate)).toLocaleTimeString();//"2013年12月22日 19:38:03"
                    //--第一种方式的结果是中文:2013年12月22日 19:38:03
    
                    //第二种方式:用Newtonsoft转为string,但是日期后有个字母T:2013-12-22T19:12:54
                    var createdOn = data.CreatedOn == "" || data.CreatedOn == null ? "" : data.CreatedOn.replace("T", " ");
                    dlg.find("#CreatedOn").val(createdOn);//此字段不可更改,只是显示。
                    //第二种方式的结果是:2013-12-22 19:13:17
    
                    var birthday = data.Birthday == "" || data.Birthday == null ? "" : data.Birthday.substr(0, 10);
                    dlg.find("#Birthday").val(birthday);
    
                    //在客户端更新选定数据行
                    var rowData = {
                        No: data.No,
                        Name: data.Name,
                        Email: data.Email,
                        Birthday: birthday,
                        CreatedOn: createdOn
                    };
                    grid.jqGrid("setRowData", id, rowData);
                    //打开对话框
                    dlg.dialog("open");
                }
            });
        }
    }
    
    //增删改操作
    function operate(event) {
        if (!$("#myForm").valid()) {    return false;    }
    
        var dlg = $("#myDialog");
        var grid = $("#grid");
        var id = grid.jqGrid("getGridParam", "selrow");//客户端的行号索引
        var no = grid.jqGrid("getRowData", id).No;     //选中行的No字段值
    
        var name = $.trim(dlg.find("#Name").val());
        var email = $.trim(dlg.find("#Email").val());
        var birthday = $.trim(dlg.find("#Birthday").val());
        var createdOn = $.trim(dlg.find("#CreatedOn").val());
    
        var params = {
            "No": no,
            "Name": name,
            "Email": email,
            "Birthday": birthday,
            "CreatedOn": createdOn
        };
        if ($(event.target).text() == "创建") {
            var actionUrl = "/Home/Add";
            $.ajax({
                url: actionUrl,
                type: "post",   //默认为get(此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站。若要允许 GET 请求,请将 JsonRequestBehavior 设置为 AllowGet)
                data: params,   //传递给服务端的数据
                dataType: "json",
                cache: false,
                error: function (textStatus, errorThrown) { alert("系统ajax交互错误: " + textStatus); },
                success: function (data, textStatus) {
                    if (data.msg == "success") {//此处的success来源于后台的json
                        var dataRow = {     //要添加的数据
                            No: data.No,   // 从后台传来的json得到系统分配的序号(No是一个自动递增字段) 
                            Name: name,
                            Email: email,
                            Birthday: birthday,
                            CreatedOn: data.CreatedOn//接收数据库自动创建的日期
                        };
                        //在客户端操作,避免reload表格。
                        var selectedId = $("#grid").jqGrid("getGridParam", "selrow");
                        if (selectedId) {
                            $("#grid").jqGrid("addRowData", data.No, dataRow, "before", selectedId);//如果有选定行则添加在选定行前面                  
                        } else {
                            $("#grid").jqGrid("addRowData", data.No, dataRow, "first");//没有选定行则添加在第一行
                        }
                        //似乎高亮显示用户刚添加的数据行是个不错的主意
                        $("#grid").jqGrid("setSelection", data.No);
                        dlg.dialog("close");
                        alert("添加操作成功!");
                    } else {
                        alert("添加操作失败!");
                    }
                }
            });
        }
        else if ($(event.target).text() == "删除") {
            var actionUrl = "/Home/Delete";
            $.ajax({
                url: actionUrl,
                type: "POST",
                data: params,
                dataType: 'json',
                cache: false,
                error: function (textStatus, errorThrown) { alert("交互错误" + textStatus); },
                success: function (data, textStatus) {
                    if (data.msg == "success") {
                        grid.jqGrid("delRowData", id);
                        dlg.dialog("close");
                        alert("删除成功!");
                    } else {
                        alert("删除失败!");
                    }
                }
            });
        }
        else if ($(event.target).text() == "更改") {
            var actionUrl = "/Home/Update";
            $.ajax({
                url: actionUrl,
                type: 'POST',
                data: params,
                dataType: 'json',
                cache: false,
                error: function (jqXHR, textStatus, errorThrown) { alert("status:" + jqXHR.status + "
    StatusText:" + jqXHR.statusText); },
                success: function (data, textStatus, jqXHR) {
                    if (data.msg == "success") {
                        var rowData = {
                            No: no,
                            Name: name,
                            Email: email,
                            Birthday: birthday
                        };
                        grid.jqGrid("setRowData", id, rowData, { color: "red" });//可以添加css
                        dlg.dialog("close");
                        alert("更新成功!");
                    } else {
                        alert("更新失败!");
                    }
                }
            });
        }
    }

    三、Controller:

         public ActionResult CRUD()
            {
                return View();
            }
    
            //Add
            public ActionResult Add(Member m)
            {
                Member member = new Member();
                member.No = m.No;
                member.Name = m.Name;
                member.Email = m.Email;
                member.Birthday = m.Birthday;
                member.CreatedOn = m.CreatedOn;
    
                MyContext db = new MyContext();
                db.Members.Add(member);
                db.SaveChanges();
                return Json(new
                {
                    msg = "success",
                    No = member.No,    //返回给前端序号
                    CreatedOn = member.CreatedOn//返回给前端
                });
            }
    
            //delete
            public ActionResult Delete(Member m)
            {
                MyContext db = new MyContext();
                Member member = db.Members.First(mb => mb.No == m.No);
    
                db.Members.Remove(member);
    
                db.SaveChanges();
                return Json(new { msg = "success" });
            }
    
            //update
            public ActionResult Update(Member m)
            {
                MyContext db = new MyContext();
                Member member = db.Members.First(mb => mb.No == m.No);
    
                member.Name = m.Name.Trim();
                member.Email = m.Email;
                member.Birthday = m.Birthday;
                member.CreatedOn = m.CreatedOn;
    
                db.SaveChanges();
                return Json(new { msg = "success" });
            }
         //为客户端选中行提供数据
         public string GetRowData(Member m)
            {
                MyContext db = new MyContext();
                Member member = db.Members.Find(m.No);
    
                return Newtonsoft.Json.JsonConvert.SerializeObject(member);
            }

    --End--

  • 相关阅读:
    2017icpc青岛
    训练赛
    CF1598F
    CF1581
    CF1594
    CF1581D
    codeforces round 746 div2 C-E
    How I Think About Learning
    Linux Sysadmin Basics 4.1 -- Filtering Output and Finding Things (&&, cut, sort, uniq, wc, grep)
    Linux Sysadmin Basics 04 -- Shell Features -- Pipes and Redirection
  • 原文地址:https://www.cnblogs.com/ibgo/p/3495134.html
Copyright © 2011-2022 走看看