注意事项
视图中接收的返回值和控制器封装的返回值要一致
控制器封装的返回值:ViewBag.airports= airports;
视图:List<S_Airport> airports =ViewBag.airports;(变量名可以不一样)
2、若修改了数据库,要重新引用数据模型
3、连表查询 join tab被连接表 in model.表名on 连接表.外键/主键/外键 equals tab被连接表.主键/外键/外键
新增
主要分为: 数据验证、新增数据保存到数据库 两部分
(1)其中需要验证是否有输入数据,如果是必须填写的,就弹出提示框提醒完成填写,不然无法继续下一步操作。
例:
//判断名字是否填写
if (Name==undefined||Name=="") {
alert("请填写姓名!");
return;
}
(2)验证输入的格式是否符合规范,比如,规定输入数字,但某些用户可能会输入中文,英文,特殊字符等来捣乱,而需要进行限制的特别多,就像身份证号不能输入字符,中文等,还有电话号码,所以需要限制其只能输入规定的格式,我们一般使用正则表达式来约束。当然,有些无需使用正则表达式,例如:身份证号有专属的约束方式
举个例子:邮箱
"^([a-zA-Z]|[0-9])(\\w|\\-)+@[a-zA-Z0-9]+\\.([a-zA-Z]{2,4})$"
(3)验证新增的是否与数据库的重复,若是重复,就不能保存到数据库,否则有可能会发生冲突,例如:新增用户,当没有限制新增重复的用户到
数据库时,使用重复的用户账户就会产生冲突,无法进行登陆
当然,只是有些不能重复添加,不代表所有的都不能重复,就像名字,不是谁的名字都是唯一的
还有像新增旅客的,需要计算座位数是否足够
修改
和新增基本一样,但修改时在原有的基础上进行修改,需要进行数据回填,对比数据库中的是否不相同,再进行修改。当然如果全部相同,可以不修改进数据库,也可以不修改进数据库直接弹出提示框“无需修改”。
修改时,基本都使用事务,避免修改失败时,传入数据库一半是修改后的,一半是失败导致修改不成功的情况。
using (TransactionScope scope = newTransactionScope())
{
……
……
myModel.Entry(user).State= System.Data.Entity.EntityState.Modified;
if (myModel.SaveChanges() > 0)
{
//--------++++事务提交+++
scope.Complete();
msg.State = true;
msg.Text = "修改成功";
}
else
{
msg.Text = "修改失败";
}
}
也就是说,未到达scope.Complete()之前,修改后的数据,在数据库中是找不到的。没有到scope.Complete(),或者是写了using (TransactionScope scope = newTransactionScope()),但没有写scope.Complete(),就算运行没有发生错误,提示修改成功,但数据库是不会保存修改数据的。也就是事务没有提交,数据库就会撤回保存修改
删除
先查询是否正在使用,再查询出所有需要删除的数据,进行删除
因删除是一瞬间的事,所以需要提醒一下,避免误删
例:layer.confirm("您确认要删除该用户吗?", { icon: 3, title: '提示' }
需要注意的是:
如果像飞机订票系统中的删除人数,需要释放座位数,退还票钱。
因为某特殊原因需要删除航段,可以给客户进行换航班的处理,若票价有差异,也需退回票钱。
查询
查询是带有目的性的,所以查询必须有一个及以上的查询条件:日期,姓名,身份证等等,因为这个项目的一些模块的查询主要涉及时间,所以在这个项目里一般使用日期的比较多,为了方便及少写代码基本都是引用插件
//初始化多个日历插件 layui
$(". myLayDate").each(function () {
layDate.render({
elem: this,
type: 'date',
btns: ['clear', 'confirm'],
trigger: 'click'
});
});
查询:获取查询条件,与数据库进行比较,将符合查询条件的数据筛选出来,进行排序,返回页面。
小结
1. 加载层一般在网络请求前打开 ,在网络请求的回调的最前面关闭
2. "@Url.Content("~/Main/UserLogin")"中 ~ :wed应用的根
/ :网站的根,转到端口(第一个“/”)
可用于项目发布后的定位
3. 一般为了避免回退到登录页面,会使用replace
4. 当浏览器第一次请求服务器时,服务器会建一个“空间”session,将请求的会话存到session中,服务器再返回响应response(携带sessionID)给浏览器,浏览器也会创建一个“空间”cookie,将response储存到cookie中,而之后的第二次及以后的请求浏览器都会将对应的sessionID携带上,再传到服务器。【相当于相互储存了对方的信息】,所以浏览器上使用过账号和密码若是点击记住,就会储存到cookie中,但cookie的最长保存时间为7天,就是说超过7天没有登录,浏览器就会自动忘记记住的账号和密码。
5. Lambda表达式 : 变量=>使用这个变量的语句
可简写为:
6. data()
data-* 属性用于存储页面或应用程序的私有自定义数据。
data-* 属性赋予我们在所有 HTML 元素上嵌入自定义 data 属性的能力。
data-* 属性包括两部分:
属性名不应该包含任何大写字母,并且在前缀 "data-" 之后必须有至少一个字符
属性值可以是任意字符串
7. 当需要使用到某个页面的操作时,可以设置一个操作标志,就像PNR复制,代理人票证查询的自定义列,PNR的添加航段,部分出票等。为避免发生冲突,在打开被使用的页面前,会清除这些标志,而操作标志基本上都是放在sessionStorage(会话储存)中。
8. HTML5的WebStorage提供了两种API:localStorage(本地存储)和sessionStorage(会话存储)。
(1)、localStorage:localStorage的生命周期是永久的,关闭页面或浏览器之后localStorage中的数据也不会消失。而localStorage除非主动删除数据,否则数据永远不会消失。
(2)、sessionStorage的生命周期是在仅在当前会话下有效。sessionStorage引入了一个“浏览器窗口”的概念,sessionStorage是在同源的窗口中始终存在的数据。只要这个浏览器窗口没有关闭,即使刷新页面或者进入同源另一个页面,数据依然存在。
但是sessionStorage在关闭了浏览器窗口后就会被销毁。同时独立的打开同一个窗口同一个页面,sessionStorage也是不一样的。
(3)、localStorage和sessionStorage只能存储字符串类型,对于复杂的对象可以使用ECMAScript提供的JSON对象的stringify和parse来处理
(4)、localStorage和sessionStorage的存储数据大小一般都是:5MB
(5)、localStorage和sessionStorage都保存在客户端(浏览器),不与服务器进行交互通信。
.setItem(key,value); 用于添加和修改保存的数据 key不存在时为添加,key存在时为修改
.getItem(key); 获取指定key的value
.removeItem(key); 移除指定key的数据
9. substr()
该方法可在字符串中抽取,从start下标开始的指定数目的字符.
可用于日期的转换:由 /Date(1596038400000)/ 转成:
输出:
substr(6,13)即 从第6个字符开始获取后面的13个字符
10. layui-form标识一个表单元素块为layui的表单,
注意:一旦使用layui-form,如果不加载form模块,select、checkbox、radio等将无法显示,并且无法使用form相关功能