最近参与了HotelIInventory这个项目的一个模块的开发。经验不足,对Sql脚本的编写能力还需要提高,这个模块的Sql语句大多是组长替我写的,如果靠我自己来写,我绝对是没有能力完成工作的,在此多谢组长,也多谢领导教我在前端使用面向对象的方法,受益匪浅。不过我相信多看看别人写的Sql脚本,自己会慢慢提高的。当前这个项目也快完结了(不过貌似还要改需求,真的是杀程序员不需要用枪,只需要改变三次需求,这次需求改得也太大了,心累~~~),现在总结一下项目开发中遇到的一些小问题,以免日后再犯而误了工时。

1.在给html标签添加事件时,比如input的onchange事件,最好不要将当前input 的值直接当做参数传递给onchange的function(之前这么做的原因好像是为了保存旧的值,为了能够在验证错误数据的时候将旧值再赋值给文本框),因为可能出现:如果input的值带有特殊符号,比如单引号或者双引号,有可能导致浏览器无法分辨单双引号的开头结尾,导致js报错。解决方案就是将当前这个input对象this当做参数传递给onchange的function,然后再function中通过this来操作当前这个input;

2.在含有thead和tbody的table中这两个节点也是属于dom树种的一个分支点,所以在通过td往上找parent的时候,不要漏了这两个(这是在有显示定义thead和tbody的情况下,如果没有显示定义,则这两个元素是没有的);

3.在含有多列的table中,如果要找到某一列中的某个标签,最好还是不要通过下表来找td,而是通过给td命名,然后通过这个命名来过滤td,以免哪一天需求一改变,少了或多了一列td,那维护起来就困难了;

4.判断可空类型的DateTime类型是否有值的方法:checkinDate.HasValue,HasValue是属性不是方法,没有括号。对可空类型的DateTime格式化为自己想要的显示类型,需要先通过这个DateTime? 类型的一个Value属性,然后调用ToString("yyyy-MM-dd")方法来转化为自己想要的显示格式;

5.select标签的选项改变事件时onchange,而不是onselect,选中是selected="selected",而不是checked属性;

6.获得日期的时间差(天、时、分、秒...都可以):TimeSpan span = Date1.Value.Subtract(Date2.Value);然后通过span这个对象来获取自己想要的时间差,如span.TotalDays可以获得相差天数;

7.js的split分割字符串方法,eg:如果想要对"-"这个分隔符进行字符串分割,如果用户在文本框仅仅输入了"-"横杠,那么这个字符串.split("-")返回的将是字符串个数为2的数组;

8.在table中插入一行,需求如下:如果表格里面没有tr(指tbody下的tr)则直接插入一行,如果有tr,则在表格的最第一行插入这个new tr。因为Jquery的append方法默认是在指定元素的末尾插入,所以需要对这个table是否有行  进行判断,代码如下:

            var allTr = $("#mainTable>tbody>tr");
if (allTr.length > 0)//如果大于一行,则插到表格最前面
{
var firstTr = allTr.eq(0);//主表的第一行
firstTr.before(newTr);
}
else {//如果当前表格为空行,则直接插入表格
$("#mainTable>tbody").eq(0).append(newTr);
}

9.前台声明json的方法:var jHotel = eval("({hotelNo:0,hotelName:'',roomList:[]})");要对里面的每个属性赋初始值,如果是数组则赋值为"[]"空数组,数组里面就可以存放任意类型的数据了,还能继续往里面添加json对象,因为roomList其实就是个数组,所以操作这个跟操作普通数组是完全一致的,还是使用push插入,pop删除;

10.关于前端的Json对象,Json对象在前端是引用类型(也不知道是不是叫引用类型,但是你对于该对象的一个副本的操作,会直接影响到主体本身),当你把一个全局的json对象赋值给一个function中的一个局部变量,对这个局部变量的操作会直接影响到全局的Json对象,如下:

var jHotel = eval("({hotelNo:0,hotelName:'',roomList:[]})");
var jRoom = eval("({roomNo:0,hotelNo:0,checkinDate:'',rooms:0,notes:'',orderList:[]})");
var jOrder = eval("({orderNo:0,hotelNo:0,roomNo:0,note:'',travelerList:[]})");
var jTraveler = eval("({travelerNo:0,roomNo:0,orderNo:0,roomType:0,status:0})");

经过eval函数操作之后,它们就变成了json对象,在这边声明这几个对象是为了共用,但是这四个对象却是“引用类型”的,对一个的改变,会影响到其他副本,导致这所谓的共用,根本就是独裁。何为影响,假设调用以下这个方法:

        function fun()
{
var j = jHotel;
j.hotelNo="123";
}

则这时候如果再输出jHotel.hotelNo,将会是"123",这已经影响到了主体jHotel,不过如果这么操作:j="abc",而jHotel不会变为"abc",原因应该是将j重新指向了另一地址。

解决方法:全局变量将其声明为Json格式的字符串,这时候还只是字符串,所以没有引用的概念,对它们的修改,不会影响到主体

    var jHotel = "{hotelNo:0,hotelName:'',roomList:[]}";
var jRoom = "{roomNo:0,hotelNo:0,checkinDate:'',rooms:0,orderList:[]}";
var jOrder = "{orderNo:0,hotelNo:0,roomNo:0,note:'',travelerList:[]}";
var jTraveler = "{travelerNo:0,roomNo:0,orderNo:0,roomType:0,couponCode:'',status:0}";
var jHotel2= "{hotelNo:0,hpfOrder:{}}";

以上它们只是字符串,然后可以在function中声明一个局部变量,然后将其eval转为json对象,然后对这个对象进行操作,而不会影响到全局变量;

11.用JQuery找到可见的元素:$(mainTr).find("td").eq(1).find("input[name=hotelName]:visible").eq(0).val();就是用:visible选择器;

12.在Jquery中,如果没有找到input对象(其他标签也一样),如果对其值.trim(),会报错: 无法获取未定义或 null 引用的属性“trim”。如下:$(roomtr).find("input[name=tourNo]:visible").eq(0).val().trim();如果没有找到这个input,而对其值调用trim方法,则会报错;

13.在table中的td找父元素的时候,经常想通过parent方法来找,但是这种情况经常会出现少算或多算了一层,导致调试起来麻烦,所以还是写个递归的方法,找到某某属性为某某值的父节点,这样就不用在js里面写一大堆的.parent()方法了,递归方法如下:

        //递归找到  主行  mainTr
function findParent(e) {
var parent = $(e).parent();
var parentName = parent.attr("name");
if (parentName == "mainTbody") {//当找到父节点的name属性为maintbody的时候,返回当前的tr
return e;
}
else {
return findParent(parent);//如果还不是,则继续往上递归的 找
}
}

14.Json对象转为字符串的方法:JSON.stringify(json对象),返回一个json格式的字符串;

15.$.ajax方法中的datatype参数,指的是服务器返回给ajax的数据的类型,如果没有指定是json格式,则要在succes中的function先转为json对象(即用eval),才对其进一步操作;

16.遍历前端的数组Array,通过Jquery中的each方法,可以实现,而在each方法中的this指的就是当前数组的当前遍历的这个元素,如:var arr1=new Array();arr1=[1,2,3];则此时this指的就是1或2或3,如果里面存的是对象(对象里面又有属性,比如name),则this指的是这个对象,如果要获取name的值,则通过this.name,可以对name属性进行操作;

17.备注$.ajax方法,不然老是记不住:

            $.ajax({
type: "POST",
url: "/Hotel/EditHotel",
data: {
jsonStr: JSON.stringify(jsonRoom)
            //后台的EditHotel方法将会有一个字符串类型,名为jsonStr 的参数来接收这个值
},
async: true,
dataType: "json",
beforeSend: function (a) {
},
success: function (data) {
},
error: function (e) {
alert(e.statusText);
}
});

18.Jquery中的closest方法,找到离自己最近的元素,找的是父节点,不包括任何兄弟,eg:$(e).closest("tr[name=roomEditTr]")找到离e最近的name为roomeditTr的tr;

19.字符串处理方法substr(start,count),第一个参数start是要截取的起始位置(从0开始计算),第二个参数count是从start开始算起要截取几个。substring(start,end)方法第一个参数start是起始位置(从0开始),第二个参数end是结束位置(这就是跟substr不一样的地方);

20.Jquery的text()方法,这个方法是获取选中的对象内的文本,不包括该对象内的标签,但是会取到对象内的标签的文本,例如

<div id="div1">
abc
<div>efg
<div>
hijk
</div>
</div>
</div>
var divtext = $("#div1").text(); //这个取到的将会是abcefghijk

21.jQuery中的find和children,find的搜寻子孙后代,而children是找直接子元素,不包括子孙后代;

22.Json对象是没有clone方法的;

23.选择器中的not方法,not(e)排除e对象,eg:$(e).parent().parent().find("input[type=checkbox]:visible").not(e).attr("disabled", "disabled");//排除自己e;

24.在编辑数据的时候,需要先把旧的数据保存在一个隐藏的字段中,以免在验证的时候,数据验证不通过,导致界面上显示的与数据库的不一致;

25.判断是否为纯数字的正则表达式:

        function checkInt(num) {
var reg = /^-?\d+$/;//对正则表达式不熟,知道的朋友帮忙解释下"-?"的意思
if (reg.test(num)) {
return true;
}
else {
return false;
}
}

26.在前端获取指定格式的时间:

        //获取yyyy/MM/dd
function dateformat(datestr)
{
var date=new Date(datestr);
var month=date.getMonth();//getMonth()返回的数是从0开始
if(month<9)
{
month="0"+(month+1);
}
else
{
month=month+1;
} var day=date.getDate();//getDate()返回的数是从1开始
if(day<10)
{
day="0"+day;
} return date.getFullYear().toString()+"/"+month.toString()+"/"+day.toString()
}

附上: start.setDate(start.getDate() + 1);

27.数据库insert后返回主键值,在insert语句结束的后面加入SELECT CAST(SCOPE_IDENTITY() AS INT),在执行的时候返回的就是主键的值;

28.数据库中的字段为int类型,在实体类中声明为可空的int?类型,在将前台页面中,如果没有将int型数据传回后台,则这个int类型的变量可能为空,导致在插入数据库时报错(大概是将null赋给一个int类型),解决方法就是在插入数据库之前,判断该变量是否为null,如果为null则赋值为0.如果不声明为可空的int类型,则前台必须传一个值给这个变量,否则在json反序列化为对象时会报错;

29.@Html.AntiForgeryToken()用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施,详情,在Controller中也要加入[ValidateAntiForgeryToken]过滤特性。该特性表示检测服务器请求是否被篡改。注意:该特性只能用于post请求,get请求无效;

30.@Html.IdFor(m => m.users_name)可以获得ID,相应的有获得name等等;

31.GET用于检索已知的 Resource 表示。POST用于创建新的、动态命名的 Resource。PUT用于编辑已知 Resource。不用它来创建 Resource。DELETE用于删除已知 Resource;

32.Sql获取数字的千分位,就是将一个数字以三位,用逗号隔开,sql代码如下:  

  select reverse(stuff(reverse(convert(varchar,convert(money,1234333000),1)),1,3,''))----这个是不带小数点的数字,如果强加了小数点,select的结果是没有小数点的,这个的结果是:1,234,333,000

  select convert(varchar,cast(121565610000.012 AS MONEY),1)-----这个是带小数点的数字,只保存小数点后两位,如果数字本身没有小数位,会默认补上两个0,原因在与convert的最后一个参数(这里的值是1),当值是1的时候将会小数两位,当值是2的时候会小数4位,当为0 的时候会将数字直接输出(也就是没有逗号分隔,但是会有两位小数,即使原数据没有小数位)

33.属性的属性

    [Display(Name = "确认密码")]
[Required(ErrorMessage = "请确认密码")]
[StringLength(, MinimumLength = , ErrorMessage = "输入密码错误,密码长度4~10")]
[RegularExpression(正则表达式, ErrorMessage = "输入密码错误")]

HotelIInventory项目小结的更多相关文章

  1. 记一次SSM项目小结(一)

    记一次SSM项目小结(一) ssm框架 环境配置 服务器配置 解决方法  拦截器重定向到localhost nginx和tomcat中session失效 mybatis的xml文件不生效 数据库用户创 ...

  2. [2017BUAA软工助教]个人项目小结

    2017BUAA个人项目小结 一.作业链接 http://www.cnblogs.com/jiel/p/7545780.html 二.评分细则 0.注意事项 按时间完成并提交--正常评分 晚交一周以内 ...

  3. [2017BUAA软工助教]结对项目小结

    2017BUAA结对项目小结 一.作业链接 http://www.cnblogs.com/jiel/p/7604111.html 二.评分细则 1.注意事项 按时间完成并提交--正常评分 晚交一周以内 ...

  4. 在oneAPM参加第一个项目小结

    从12月15日开始加入进入oneAPM的第二个项目,也是我真正近距离接触项目的一次吧,到今天差不多接近尾声了,很高心能和大家一起共同改造这个项目,虽然说我做的贡献并不大,但是身临项目真的会收获很多体会 ...

  5. .NET项目开发—浅谈面向接口编程、可测试性、单元测试、迭代重构(项目小结)

    阅读目录: 1.开篇介绍 2.迭代测试.重构(强制性面向接口编程,要求代码具有可测试性) 2.1.面向接口编程的两个设计误区 2.1.1.接口的依赖倒置 2.1.2.接口对实体的抽象 2.2.迭代单元 ...

  6. 一个WPF小项目小结

    一:缘起 老板有做PC桌面客户端的需求,做的是能耗的计算和评估,要算能耗,就有很多环节,最后对这些环节数据进行一些简单计算.我想要是做的话就用比较熟的wpf,就去聊了下,对方给了1张比较复杂的Exce ...

  7. .NET项目开发—浅谈面向对象的纵横向关系、多态入口,单元测试(项目小结)

    阅读目录: 1.开篇介绍 2.使用委托消除函数串联调用 2.1.使用委托工厂转换两个独立层面的对象 3.多态入口(面向对象继承体系是可被扩展的) 4.多态的受保护方法的单元测试(Protected成员 ...

  8. Docker第三方项目小结

    软件项目的成功常常根据其催生的生态系统来衡量.围绕或基于核心技术构建的项目增添了功能和易用性,它们常常日臻完善.Docker就是一个典例,有众多第三方项目扩展.补充或改进Docker. •Docker ...

  9. WordCount测试项目小结

    一.本文对应项目GitHub地址 https://github.com/ReWr1te/WCProject 请参照最新版本(WCProject4.0) 二.项目PSP表格 PSP2.1 PSP阶段 预 ...

随机推荐

  1. 兼容性问题( css)

    记录平时遇见的兼容性问题,有更好的解决办法希望各位提出,会持续更新 提出时间 问题描述 解决方案 2014/7/15 table下面使用img或者其他元素例如embed会产生,对应的空隙,假如使用文字 ...

  2. 在树莓派上设置无线静态IP

    修改文件: /etc/network/interfaces,命令如下 sudo nano /etc/network/interfaces 将最后一句iface default inet dhcp,替换 ...

  3. CodeForces 519B A and B and Compilation Errors【模拟】

    题目意思还是蛮简单的,看 输入数据输出数据还是比较明显的 我用排序来写还是可以AC的 //#pragma comment(linker, "/STACK:16777216") // ...

  4. Tcl语言笔记之一

    1,一个TCL脚本可以包含一个或多个命令.命令之间必须用换行符或分号隔开 2,置换 substitution %set y x+100                               // ...

  5. Cognos 图表用图片取代”没有数据显示”

    在Cognos中做出来报表展示的时候因为没有数据感觉显示“没有可用数据”感觉很不美观.所以想用一张图片代替. 在图表的属性里面有一个“无数据内容”,点击打开之后有三个选项: 默认就是显示“没有可用数据 ...

  6. 基于visual Studio2013解决算法导论之016查找最大值最小值

     题目 查找最大.最小值 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> ...

  7. Linux下VNC的安装和开机启动

    1.确认VNC是否安装默认情况下,Red Hat Enterprise Linux安装程序会将VNC服务安装在系统上.确认是否已经安装VNC服务及查看安装的VNC版本[root@testdb ~]# ...

  8. vb和vb.net事件机制

    学习java事件前,回顾了下vb6和vb.net的事件机制,总结在这里,供对比用. 事件是面对对象中对象间通信的方法.事件发生者(又叫事件源)发生一个事件时,通过发送一条消息,给事件接受者(事件处理者 ...

  9. ZOJ 3492 模拟循环链表线性查找

    WA了好几次最后找到错因是因为数组开小了! = = string whose length never exceeds 20 所以至少要开到21 = = ,我却一直开20 ╮(╯▽╰)╭ AC代码: ...

  10. ie6背景透明的设置方法 ie6背景颜色透明和png图像透明解决方法

    IE6浏览器,让我们又爱又恨.爱它的是,可以让我们写的代码的时候,可以更标准,恨的是,它有太多无厘头的IE6常见bug(详情点击),让我们焦头烂额.现在现在用百度浏览器调查,国内占有率不到6%了,但是 ...