5 .9
下午拿到项目,简单熟悉了一下界面以及数据库,使用了viewmodel,正式开工。
从网上查阅好像有微软提供的关于System.Web.Mvc.Ajax的类,包括jquery类库,并没有仔细了解;我没有使用他们,一样可以达到效果,详见下方代码
遇到的问题
- 解决方案中ef框架数据库优先方法生成的实体类独立的建了一个项目叫GKQ.model。于是在主工程GKQ.web的web.config里需要加上GKQ.model的app.config的连接字符串里的内容,记得改initial catalog;
- mvc中的url传参方式。有两种http://www.jb51.net/article/92334.htm
- linq语句查询指定列的方法(可以起别名),以及将其转化为JSON格式(见下方示例代码我是先新建了一个内部类,再把new一个该类的list,把其序列化以后赋给jsonresult对象,不知是否妥当)https://www.cnblogs.com/wphl-27/p/5894796.html--------https://www.cnblogs.com/fumj/p/3437726.html
- mvc ajax的前后台示例 https://blog.csdn.net/aofengdaxia/article/details/6880020 以下是我的代码
注意:class staff { public int awid { get; set; } public string cName { get; set; } } public ActionResult staffAdjust(int id) { GKQEntities dbcontext = new GKQEntities(); var q = from d in dbcontext.G_Staff where d.iDepartment == id select new { awid=d.Awid ,cName=d.cName};// List<staff> staffs = new List<staff>(); foreach (var i in q) { staff s = new staff(); s.awid = i.awid; s.cName = i.cName; staffs.Add(s); } JsonResult jsr = new JsonResult(); jsr = Json(staffs,JsonRequestBehavior.AllowGet) ; return jsr; }
我试了一下这里如果把JsonRequestBehavior.AllowGet去掉,前台xhr对象就接收不到返回了,具体见https://www.cnblogs.com/lmfeng/p/3596175.htmljsr = Json(staffs,JsonRequestBehavior.AllowGet) ;
前台,几乎没啥变化:var xhr = createXHR();//上面写的一个函数 var departid = ybmselectbox.options[ybmselectbox.selectedIndex].value; var url = "/sysManagement/staffAdjust/" + departid; xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) { var json = JSON.parse(xhr.responseText) ;//{{awid: , cName:},{awid: , cName:}},经过parse有JSON转化为JavaScript对象 clearselectbox(nameselectbox); for (var i = 0; i < json.length; i++) { var option = new Option("value", json[i].awid); option.text = json[i].cName; nameselectbox.add(option); } clearselectbox(xbmselectbox); for (var j = 1; j < departcount; j++) { if (j == ybmselectbox.selectedIndex) { } else { var option = new Option("value", ybmselectbox.options[j].value); option.text = ybmselectbox.options[j].text; xbmselectbox.add(option); } } } } } xhr.open("get", url, true); xhr.send(null); }
- 感觉今儿下午就一直在写js,js操作dom。主要是对于select以及option元素的操作,参考《JavaScript高级程序设计》p430,涉及到select取当前选中对象;添加、删除、重排、选项等,select、option对象的属性等;记得对select删除或重拍都会重置index
- option标签设置seleced属性不起作用时。在select元素上加上autocomplete="off"
- 一开始想在每个option加上onclick,后来查到这种方式不对。若想在改变selec选中项时触发,在select设置onchange属性。在select设置onclick也不行
- js里还犯了一个比较低级的错误
clearselectbox(nameselectbox); clearselectbox(xbmselectbox); var option = new Option("value", "tishi");//不能直接 nameselectbox.add(ybm.options[0]),这样会直接把第一个option对象连根拔过去 option.text = "--请选择--"; nameselectbox.add(option); option = new Option("value", "tishi"); option.text = "--请选择--"; xbmselectbox.add(option);
今日总结,第一个项目,人员管理,js得熟练一些,因为查询几乎所有的交互都要用到ajax,今天从下午写到刚才,开头会比较慢,但熟练也就好了;对了,今天捕捉到一个比较好的思想,就是展示页面的方法里要把一些不变的对象传进去,具体来说就是原部门,领导,禁止人员,这个在开始做之前脑海中一定要计划好。
明天:还有一点ajax,很快就能处理完,然后是一些按钮操作,预计明天能完工
五月十日------------------------------------------------------------------------------------------------------------
上午被高数老师放鸽子了,回家继续写,基本完工,凡是有一些逻辑上的地方和需求有些出入,以及一个新增页面以后有时间写吧,最后还得参照桌面工程检查一下
- js的confirm方法,会返回一个窗体具有阻塞功能,包含确定以及取消按钮,可作为alert的扩展 http://www.jb51.net/article/77673.htm
var msg = "确认将 " + staffname + " 更换为 " + xbmname + " 部门么?"; if (confirm(msg) == true) { } else { }
- ajax嵌套。有需求所以在网上查了查,都说两层的xhr.open(get,url,*),这个*的地方需要都false,不然会乱;但是非常奇怪的事我这里全是true才可以正常使用,也就是异步模式???
- 对于ef创建的dbcontext以及实体对象的查询修改等操作,简单接触了lamada表达式,以及大量使用了如下查询修改
staff对象就相当于表里的一条记录,直接对这条记录的bCheif进行修改即可,最后一定要记得savechange。 ef提供的方法以及linq的查询方法真的是功能强大,当然还有lamada以及First方法,具体细节待探究 linqG_Staff staff = dbcontxt.G_Staff.First(d => d.Awid == staffid); staff.bCheif = true;//相当于一个update操作 depart.ZhengZhi = staff.Awid; i = dbcontxt.SaveChanges();
- 关于linq查询 这里只放一篇 https://kb.cnblogs.com/page/42476/
- 关于 linq yo sql 以及linq to entity (entity framework)之间的关系 简洁: https://www.cnblogs.com/LoveSuk/p/6739642.html https://www.cnblogs.com/qixuejia/p/5410658.html详细 :https://www.cnblogs.com/LowKeyCXY/p/7121850.html 反正我就记得好像是这两种方式在查询修改等操作都差不多,只是创建上下文对象上不太一样。
- 举例 linq to sql https://kb.cnblogs.com/page/42476/
Customer cust = db.Customers.First(c => c.CustomerID == "ALFKI"); cust.ContactTitle = "Vice President"; db.SubmitChanges();
5.11-------------------------------------------------------------------
- mvc模式下前台form往后端以post方式传数据。涉及到model binder,注意input的name要与实体类属性完全相同才会被接受到;一些细节在《七天系列》https://www.cnblogs.com/powertoolsteam/p/MVC_three.html
注意如果需要重定向到某一个方法,用如下方法<form method="post" action="/sysManagement/saveStaff" id="myform"> <label>序号</label><input name="iSerialNumber" type="text" οnblur="checknum()" /><span id="numerro"></span><br /><br /> <label>姓名</label><input name="cName" type="text" οnblur="checkname()" /><span id="nameerro"></span><br /><br /> <label>部门</label> <select autocomplete="off" id="selectbox" name="depart"> <option value="tishi" selected="selected"> --请选择-- </option> @foreach (G_Department d in Model.departs) { <option value="@d.Id "> @d.D_Name </option> } </select><br /><br /> <button type="button" οnclick="checkform()"> 提交 </button><br /><br /> </form> </div>
生成RedirectToRouteResult对象,其是actionresult的孩子;这里后台函数参数直接为一个实体对象来获取post数据,涉及到model binder,注意input的name要与实体类属性完全相同才会被接受到;RedirectToAction("StaffManagement");
public ActionResult saveStaff(G_Staff s1) { string serialNum = s1.iSerialNumber; string name = s1.cName; int departid = Convert.ToInt32(Request.QueryString["depart"]); GKQEntities dbcontext = new GKQEntities(); G_Staff s = new G_Staff(); try { s.bDel = false; s.bCheif = false; s.bFuZhi = false; s.cName = name; s.iDepartment = departid; s.iSerialNumber = serialNum; dbcontext.G_Staff.Add(s); dbcontext.SaveChanges(); } catch (Exception e){ string html = "<script>alert(" + e.ToString() + ");window.location.href='/sysManagement/addStaff';</script>"; Response.Write(html);//*************************************************************** } return RedirectToAction("StaffManagement");//***************************************
- 也可以使用get,update,delete等等传数据,当请求类型是Get,Put或Delete时,值会通过查询语句发送,当请求是Post类型,值会通过Post数据传送。后台用
更多接收post https://blog.csdn.net/zhao1949/article/details/51979285int staffId =Convert.ToInt32( Request.QueryString["staffid"]);//接收get数据
Request.Form["FName"];//接收post
具体还是参考《七天》,内有细致讲解 https://www.cnblogs.com/powertoolsteam/p/MVC_three.html - js字符串的search()以及replace()
stringObject.search(regexp)
返回值
stringObject 中第一个与 regexp 相匹配的子串的起始位置。
注释:如果没有找到任何匹配的子串,则返回 -1。
js的正则表达式形式 var reg=/ / js字符串函数http://www.w3school.com.cn/jsref/jsref_obj_string.asp - js进行页面跳转。window.location.href="" 注意是等于号
- form的多重按钮提交的实现3种方式 http://www.cnblogs.com/powertoolsteam/p/MVC_three.html
- 《七天》系列的①服务端验证也是一套完整的方法论,有时间多看看;
- 《七天》系列的html帮助类
- 《七天》系列的②保持登录用户,实现注销等的方法 ;设置登录用户cookie
FormsAuthentication.SetAuthCookie(u.UserName, false);
employeeListViewModel.UserName = User.Identity.Name;
上面User.Identity好像是一个系统变量,其取出来的就是 SetAuthCookie(用于身份验证)的cookie - 为了防止不通过地址栏直接输入saveStaff访问其方法,可通过在函数前加上[HttpPost]的属性。即地址栏的get方法失效。https://www.douban.com/note/517029281/
- 感觉有必要防止重复post,不然可能会导致后台数据错误,关于防止post重复提交,在收藏夹里
---------------------------------------------------------------------------------------------
5.17
前几天写的关于增加考勤表的页面总结没了,可能忘记保存了吧,头疼。
现在在做考勤表首页
新增考勤表页面
- js前端部分 ①前端往后台传json数据 1.先生成js对象并将其序列化为JSON对象 2.send出去
②js动态操作表格。增删row cell等 ③js动态操作select。可以不用刷新页面来更新select(清空select再加option) ④xhr.open("post", url, true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.send(JSON.stringify(result));//result是JS对象
- 后台部分 ①后台接前台传来的JSON
②linq查询结果去重 .Distinct() linq中的三表联查 linq中的安倒序排列var sr = new StreamReader(Request.InputStream); JavaScriptSerializer js = new JavaScriptSerializer(); var result = js.Deserialize<monthlyCheckSave>(sr.ReadToEnd());//models里自建的一个类,专用于接收json
- Razer语法 ①想要在@大括号内输出字符串要加@:
if (flag == 1) { @:<tr class="oll"> } else{ @:<tr class=""> }
--------------------------------------------------------------------------------------------------
5.19
1.后台部分
①c#如何定义全局变量
C#中没有全局变量的概念,可以定义一个common类,通过静态变量来存放所有需要的全局变量,调用的时候通过common来调用即可。
②linq多条件动态查询
1.首先在lamada或linq里,变量必须提前转好,不能在其中写诸如tostring() conver.toInt( )等等。
2.动态多条件查询 注意一下各iQueryable之间是and关系。而且仅当最后使用它(q.tolist( )等)时才算完。。。
详细了解 https://www.cnblogs.com/zhaokunbokeyuan256/p/7053594.html
IQueryable<G_Report> tt_reports = dbcontext.G_Report;
if (year != 0)
{
tt_reports = tt_reports.Where(d => d.R_Year == year);
}
if (month != 0)
{
tt_reports = tt_reports.Where(d => d.R_Month == month);
}
if(searchDepartid != 0)
{
tt_reports = tt_reports.Where(d => d.DepartmentId == searchDepartid);
}
-----------------------------------------------------------------------------------------------------------
5.20 rngnb
1.后台利用模板动态生成word文档 只用到了Microsoft.office.Interop.Word下面放几个相关链接
https://blog.csdn.net/u011740475/article/details/38121993
https://blog.csdn.net/cqfeng/article/details/640713
https://blog.csdn.net/fujie724/article/details/5443322
https://www.cnblogs.com/pengze0902/p/5962594.html
.net配置问题https://www.cnblogs.com/lb809663396/p/5992912.html