ASP.NET MVC and jqGrid 学习笔记 6-增删改操作
程序结构:
- Member.cs
- CRUD.cshtml
- CRUD.js
- 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-增删改操作的更多相关文章
- 【转载】ASP.NET MVC Web API 学习笔记---联系人增删改查
本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查.目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的.下面我们通过创建一个简单的Web API来管理联系 ...
- ASP.NET MVC Web API 学习笔记---联系人增删改查
本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查. 目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的. 下面我们通过创建一个简单的Web API来管理 ...
- ASP.NET MVC and jqGrid 学习笔记 5-添加数据
据介绍,jqgrid有3种编辑数据的方式: Cell Editing 只允许修改某一个单元格内容 Inline Editing 允许在jqGrid中直接修改某一行的数据 Form Editing 弹出 ...
- ASP.NET MVC and jqGrid 学习笔记 1-基本配置
新建一个mvc项目后
- ASP.NET MVC and jqGrid 学习笔记 4-排序
排序(Sorting)分为两种:客户端排序和服务端排序 客户端排序的意思是把数据从数据库里一次性全部提取出来,然后在客户端进行排序,以后每次点击标题进行排序时,就不会给服务端传递请求了.这个“一次性” ...
- ASP.NET MVC and jqGrid 学习笔记 3-如何从数据库获得数据
实际应用中,大部分都是从数据库里获得数据,所以先建立一个数据库,Database first 或者Code first都可以,这里用Code first. 一.Model public class M ...
- ASP.NET MVC and jqGrid 学习笔记 2-如何从本地获得数据
上回说到jqgrid的基本配置,同时演示了显示数据的一种方法——datatype: "local".这种方法是从本地获取的,确切地说是在前端页面的javascript里写的硬编码. ...
- easyui学习笔记1—增删改操作
最近公司要用easyui,这里自己看了官网几篇文章,遇到些问题,大多数的问题都是敲代码的时候笔误,其他有些地方确实需要注意一下,这里做些笔记. 1.在mysql中建好表之后修改id字段为递增字段,发现 ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
随机推荐
- PhoneGap,Cordova[3.5.0-0.2.6]:生成Android项目时出现错误(An error occurred while listing Android targets)
我在升级到Cordova最新版本(3.5.0-0.2.6)后,在生成Android项目(cordova platform add android)时出现错误: Error: An error occu ...
- PowerMock简介
PowerMock 写单元测试可能有些难.有时仅仅为了可测试性的目标而不得不牺牲好的设计.通常可测试性和好的测试之间是一致的,但是并不总是如此.比如,由于现存框架的限制,final classes.m ...
- es基础操作
在curl 的 url 中 , 问号后台可以加上pretty=true , 可以将返回来的json进行格式化 . 如果es集群中只有一个node , 那么他的集群健康状态是黄色的 , 只需要再加一个n ...
- 第二百四十四、五天 how can I 坚持
昨天忘了.不知咋忘的,加班加迷糊了? 昨天联调接口,又加班了,好歹基本调通了. 今天,下午,开会,有点被领导批的意思,不是批我,是批我们团队. 团队. 不懂自己. 这样做有意义嘛. 睡觉.好烦. 到底 ...
- homework-01 最大子串和
题目描述 对于一个给定的数列,求该数列最大的子串和(连续) 问题分析 处理发生区间上的问题时,经常会用一个非常简单经典的思路——部分和(也有叫前缀和).部分和的思想在很多复杂的区间上的算法中都有应用, ...
- java volatile进阶(一)
本篇文章继续学习volatile.上篇文章简单的介绍了volatile和synchonized,这篇文章讲一下什么时候可以用volatile. 先看一段代码. package com.chzhao.v ...
- jquery easyui防止超出浏览器边界
var easyuiPanelOnMove=function(left,top){ if(left<0){ $(this).window('move',{ left:1 }); } if(top ...
- HDU 5754 Life Winner Bo (找规律and博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5754 给你四种棋子,棋子一开始在(1,1)点,两个人B和G轮流按每种棋子的规则挪动棋子,棋子只能往右下 ...
- C#学习笔记(六):可空类型、匿名方法和迭代器
可空类型 为啥要引入可空类型? 在数据库中,字段是可以为null值的,那么在C#中为了方便的操作数据库的值,微软引入了可空类型. 声明可空类型 我们可以使用两种方法声明一个可空类型: Nullable ...
- 如何在Visual Studio中选择C++和C#的编译器版本
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何在Visual Studio中选择C++和C#的编译器版本.