【原】gkq项目总结

5 .9

下午拿到项目,简单熟悉了一下界面以及数据库,使用了viewmodel,正式开工。

从网上查阅好像有微软提供的关于System.Web.Mvc.Ajax的类,包括jquery类库,并没有仔细了解;我没有使用他们,一样可以达到效果,详见下方代码

遇到的问题

  1. 解决方案中ef框架数据库优先方法生成的实体类独立的建了一个项目叫GKQ.model。于是在主工程GKQ.web的web.config里需要加上GKQ.model的app.config的连接字符串里的内容,记得改initial catalog;
  2. mvc中的url传参方式。有两种http://www.jb51.net/article/92334.htm
  3. linq语句查询指定列的方法(可以起别名),以及将其转化为JSON格式(见下方示例代码我是先新建了一个内部类,再把new一个该类的list,把其序列化以后赋给jsonresult对象,不知是否妥当)https://www.cnblogs.com/wphl-27/p/5894796.html--------https://www.cnblogs.com/fumj/p/3437726.html
  4. 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;
            }
    
    
    
    注意
    jsr = Json(staffs,JsonRequestBehavior.AllowGet) ;
    我试了一下这里如果把JsonRequestBehavior.AllowGet去掉,前台xhr对象就接收不到返回了,具体见https://www.cnblogs.com/lmfeng/p/3596175.html
    前台,几乎没啥变化:
            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);
            
        }
  5. 感觉今儿下午就一直在写js,js操作dom。主要是对于select以及option元素的操作,参考《JavaScript高级程序设计》p430,涉及到select取当前选中对象;添加、删除、重排、选项等,select、option对象的属性等;记得对select删除或重拍都会重置index
  6. option标签设置seleced属性不起作用时。在select元素上加上autocomplete="off"
  7. 一开始想在每个option加上onclick,后来查到这种方式不对。若想在改变selec选中项时触发,在select设置onchange属性。在select设置onclick也不行
  8. 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,很快就能处理完,然后是一些按钮操作,预计明天能完工

五月十日------------------------------------------------------------------------------------------------------------

上午被高数老师放鸽子了,回家继续写,基本完工,凡是有一些逻辑上的地方和需求有些出入,以及一个新增页面以后有时间写吧,最后还得参照桌面工程检查一下

  1. js的confirm方法,会返回一个窗体具有阻塞功能,包含确定以及取消按钮,可作为alert的扩展  http://www.jb51.net/article/77673.htm
        var msg = "确认将 " + staffname + " 更换为 " + xbmname + " 部门么?";
        if (confirm(msg) == true) {
            
        } else {
    
        }
  2. ajax嵌套。有需求所以在网上查了查,都说两层的xhr.open(get,url,*),这个*的地方需要都false,不然会乱;但是非常奇怪的事我这里全是true才可以正常使用,也就是异步模式???
  3. 对于ef创建的dbcontext以及实体对象的查询修改等操作,简单接触了lamada表达式,以及大量使用了如下查询修改
        G_Staff staff = dbcontxt.G_Staff.First(d => d.Awid == staffid);
        staff.bCheif = true;//相当于一个update操作
        depart.ZhengZhi = staff.Awid;
        i = dbcontxt.SaveChanges();
    staff对象就相当于表里的一条记录,直接对这条记录的bCheif进行修改即可,最后一定要记得savechange。 ef提供的方法以及linq的查询方法真的是功能强大,当然还有lamada以及First方法,具体细节待探究 linq
  4. 关于linq查询 这里只放一篇  https://kb.cnblogs.com/page/42476/
  5. 关于 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   反正我就记得好像是这两种方式在查询修改等操作都差不多,只是创建上下文对象上不太一样。
  6. 举例 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-------------------------------------------------------------------
昨天跟老师碰头商量了一些细节,今天上算午终于完成了

  1. 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>
    注意如果需要重定向到某一个方法,用如下方法
    RedirectToAction("StaffManagement");
    生成RedirectToRouteResult对象,其是actionresult的孩子;这里后台函数参数直接为一个实体对象来获取post数据,涉及到model binder,注意input的name要与实体类属性完全相同才会被接受到;
    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");//***************************************
                
  2. 也可以使用get,update,delete等等传数据,当请求类型是Get,Put或Delete时,值会通过查询语句发送,当请求是Post类型,值会通过Post数据传送。后台用
    int staffId =Convert.ToInt32( Request.QueryString["staffid"]);//接收get数据
    更多接收post  https://blog.csdn.net/zhao1949/article/details/51979285
    Request.Form["FName"];//接收post

    具体还是参考《七天》,内有细致讲解 https://www.cnblogs.com/powertoolsteam/p/MVC_three.html
  3. js字符串的search()以及replace()
    stringObject.search(regexp)

    返回值

    stringObject 中第一个与 regexp 相匹配的子串的起始位置。

    注释:如果没有找到任何匹配的子串,则返回 -1。

    js的正则表达式形式 var reg=/  /    js字符串函数http://www.w3school.com.cn/jsref/jsref_obj_string.asp
  4. js进行页面跳转。window.location.href="" 注意是等于号
  5. form的多重按钮提交的实现3种方式 http://www.cnblogs.com/powertoolsteam/p/MVC_three.html
  6. 《七天》系列的①服务端验证也是一套完整的方法论,有时间多看看;
  7. 《七天》系列的html帮助类
  8. 《七天》系列的②保持登录用户,实现注销等的方法                   ;设置登录用户cookie
    FormsAuthentication.SetAuthCookie(u.UserName, false);
     employeeListViewModel.UserName = User.Identity.Name; 
    上面User.Identity好像是一个系统变量,其取出来的就是 SetAuthCookie(用于身份验证)的cookie
  9. 为了防止不通过地址栏直接输入saveStaff访问其方法,可通过在函数前加上[HttpPost]的属性。即地址栏的get方法失效。https://www.douban.com/note/517029281/
  10. 感觉有必要防止重复post,不然可能会导致后台数据错误,关于防止post重复提交,在收藏夹里

---------------------------------------------------------------------------------------------

5.17

前几天写的关于增加考勤表的页面总结没了,可能忘记保存了吧,头疼。

现在在做考勤表首页

新增考勤表页面

  1. js前端部分                                                                                                                                                                       ①前端往后台传json数据 1.先生成js对象并将其序列化为JSON对象 2.send出去
        xhr.open("post", url, true);
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xhr.send(JSON.stringify(result));//result是JS对象
    ②js动态操作表格。增删row cell等                                                                                                                                ③js动态操作select。可以不用刷新页面来更新select(清空select再加option)                                                                 ④
  2. 后台部分                                                                                                                                                                      ①后台接前台传来的JSON
        var sr = new StreamReader(Request.InputStream);
        JavaScriptSerializer js = new JavaScriptSerializer();
        var result = js.Deserialize<monthlyCheckSave>(sr.ReadToEnd());//models里自建的一个类,专用于接收json
    ②linq查询结果去重 .Distinct()      linq中的三表联查     linq中的安倒序排列

  3. 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



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值