程序结构:

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

一、Model

public class Member
{
[Key]
public int No { get; set; } [Required(ErrorMessage="姓名必填")]
[StringLength(,ErrorMessage="不能超过5个字")]
public string Name { get; set; } [MaxLength()]
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', width: 60, sorttype: "int" },
{ label: 'Name', name: 'Name', index: 'Name', width: 90 },
{ label: 'Email', name: 'Email', index: 'Email', width: 100, sortable: false },
{
label: 'Birthday', name: 'Birthday', index: 'Birthday', width: 100,
formatter: 'date', formatoptions: { srcformat: 'Y-m-d', newformat: 'Y-m-d' },
editable: true, editrules: { required: true }
},
{
label: 'Created On', name: 'CreatedOn', index: 'CreatedOn', width: 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,
width: 500, height: "auto",
jsonReader: { repeatitems: false }, //prmNames: { id: "No" },
sortorder: "asc",
sortname: "No"//传递给服务端的排序字段名
});
//配置对话框(使用Jquery-UI的dialog插件)
$("#myDialog").dialog({
autoOpen: false,
modal: false, // 设置对话框为非模态对话框
resizable: true,
width: 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 + "\nStatusText:" + 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 + "\nStatusText:" + 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--

ASP.NET MVC and jqGrid 学习笔记 6-增删改操作的更多相关文章

  1. 【转载】ASP.NET MVC Web API 学习笔记---联系人增删改查

    本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查.目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的.下面我们通过创建一个简单的Web API来管理联系 ...

  2. ASP.NET MVC Web API 学习笔记---联系人增删改查

    本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查. 目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的. 下面我们通过创建一个简单的Web API来管理 ...

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

    据介绍,jqgrid有3种编辑数据的方式: Cell Editing 只允许修改某一个单元格内容 Inline Editing 允许在jqGrid中直接修改某一行的数据 Form Editing 弹出 ...

  4. ASP.NET MVC and jqGrid 学习笔记 1-基本配置

    新建一个mvc项目后

  5. ASP.NET MVC and jqGrid 学习笔记 4-排序

    排序(Sorting)分为两种:客户端排序和服务端排序 客户端排序的意思是把数据从数据库里一次性全部提取出来,然后在客户端进行排序,以后每次点击标题进行排序时,就不会给服务端传递请求了.这个“一次性” ...

  6. ASP.NET MVC and jqGrid 学习笔记 3-如何从数据库获得数据

    实际应用中,大部分都是从数据库里获得数据,所以先建立一个数据库,Database first 或者Code first都可以,这里用Code first. 一.Model public class M ...

  7. ASP.NET MVC and jqGrid 学习笔记 2-如何从本地获得数据

    上回说到jqgrid的基本配置,同时演示了显示数据的一种方法——datatype: "local".这种方法是从本地获取的,确切地说是在前端页面的javascript里写的硬编码. ...

  8. easyui学习笔记1—增删改操作

    最近公司要用easyui,这里自己看了官网几篇文章,遇到些问题,大多数的问题都是敲代码的时候笔误,其他有些地方确实需要注意一下,这里做些笔记. 1.在mysql中建好表之后修改id字段为递增字段,发现 ...

  9. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

随机推荐

  1. OpenStack Cinder组件支持的块存储设备表

    摘自恒天云官网:http://www.hengtianyun.com/download-show-id-18.html OpenStack的Cinder组件底层可以连接多种存储设备和方案,每一个Ope ...

  2. 一条scan查询把HBase集群干趴下

    最近在给公司搭建CDH集群,在测试集群性能时,写了一条简单的scan查询语句竟然把hbase集群的所有regionserver干趴下了.这让我云里雾里的飘飘然. 背景介绍 CDH集群,2台主节点.3台 ...

  3. 第二百七十一天 how can I 坚持

    每天的内容应该是这个样子,做了什么,收获了什么,有哪些东西感动了你. 就像昨天看了个电影<解救吾先生>,看完没点感觉或感受是不可能的,刘德华扮演的吾先生最终获救,不仅仅是靠运气,多少还是因 ...

  4. 10个专属于移动app开发者的最佳移动JavaScript框架

    1.Titanium Mobile JavaScript Frameworks Titanium Mobile JavaScript框架是移动应用开发者(Android & iOS)首选的最优 ...

  5. Android问题-No resource found that matches the given name (at 'theme' with value '@style/CaptureTheme').

    问题现象:在看一个实例中写到的,提示如下: [PAClient Error] Error: E2312 C:\Users\zhujq-a\Desktop\Android实例之实现扫描二维码并生成二维码 ...

  6. FrameWork 建模时查询项的usage

    § Identifier:代表被用于分组或汇总与其相关的Fact数据的列.也代表一个索引列.还代表日期或时间列.§ Fact:代表一个包含数值数据可被分组或汇总的列,例如,产品成本.§ Attribu ...

  7. HDU 5783 Divide the Sequence (贪心)

    Divide the Sequence 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5783 Description Alice has a seq ...

  8. JSF 2 textarea example

    In JSF, you can use the <h:inputTextarea /> tag to render a HTML textarea field. For example, ...

  9. Configure the handler mapping priority in Spring MVC

    Often times, you may mix use of multiple handler mappings strategy in Spring MVC development. For ex ...

  10. Spring Filter components in auto scanning

    In this Spring auto component scanning tutorial, you learn about how to make Spring auto scan your c ...