LINQ修改

开发工具与关键技术:Visual Studio 2015   LINQ
作者:孙水兵
撰写时间:2019年5月3

一、 涉及到的一些方法与知识
json对象的格式:键/值对的形式,前面为key,后面为value,如PointID:9,PointID为key,9为value
post(url, [data], [callback], [type]),url:要回填的路径(三种:1、控制器中要执行的方法名 2、/控制器名/要执行的方法名 3、/区域名/控制器名/要执行的方法名),[data]:待发送 Key/value 参数(注意:以键/值对的形式存在,前面一个(key)要与控制器接收数据的名称一致),callback:发送成功时回调函数。type:返回内容格式,xml, html, script, json, text, _default。(一般不用)
attr:设置或返回被选元素的属性值。
prop:获取在匹配的元素集中的第一个元素的属性值。返回属性值的函数,第一个参数为当前元素的索引值,第二个参数为原先的属性值
二、 修改前期工作:
在控制器最上端引入Models和装实体类的文件名称
在这里插入图片描述
实例化Models
在控制器的命名空间中实例化Models
Models.CQUPTEntities 自定义名称 = new Models.CQUPTEntities();
在这里插入图片描述
了解表格
在修改之前要先查看要修改的表格,知道自己要修改哪些数据,就比如我现在要修改的是知识点表(SYS_Point),要修改的数据为知识点名称(PointName)
在这里插入图片描述
HTML(显示部分代码)
HTML代码大概的效果是一个修改按钮,点击该按钮弹出一个模态框,该模态框中主要的字段为要修改表格中的要修改的字段。在form表格中用label标签包裹要修改的数据的名称,再用input标签包裹接收用户输入要修改的数据(input标签中的name要与涉及到表格的实体类中相同名称的类名一样,否则用loadDatatoForm进行数据回填时会出现错误)。在from表格中要设置一个隐藏域,这里用input标签设置,input标签的要求与上面的一致。其他HTML代码自行设置

<!--修改知识点 窗体-->
   <div class="modal fade" id="modalPoint" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
       <div class="modal-dialog modal-dialog-centered" role="document">
           <div class="modal-content">
               <div class="modal-header">
                   <h5 class="modal-title" id="modalPointTitle">修改知识点</h5>
                   <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                       <span aria-hidden="true">&times;</span>
                   </button>
               </div>
               <div class="modal-body">
                   <form id="fromPoint" class="form-horizontal" method="post" action="">
                       <!--隐藏域-->
                       <input type="hidden" name="PointID" id="PointID" />
                       <input type="hidden" name="SubjectID" id="SubjectID1" />
                       <div class="form-group form-row">
                           <label class="col-form-label col-4" for="PointName">知识点</label>
                           <div class="col-8">
                               <input type="text" class="form-control" name="PointName" id="PointName" />
                           </div>
                       </div>
                       <div class="form-group form-row justify-content-center">
                           <div class="col-auto">
                               <button type="button" class="btn btn-primary" id="btnSavePoint">保存</button>
                               <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
                           </div>
                       </div>
                   </form>
               </div>
           </div>
       </div>
   </div>

JS部分—数据回填
目的:弹出修改模态框时要伴随着选中要修改的数据的回填
为了确定要修改的是哪一个知识点并来进行数据的回填,在写弹出修改模态框的方法之前获取选中要修改的数据的表格的主键ID(此处为PointID),获取之后将其作为一个参数传入打开模态框的方法中。之后为了防止弹出修改模态框后模态框里面还存在上次修改后留下的数据,一般都会在弹出修改模态框之前将表单重置。重置表单之后用prop返回form表单中的action(保存修改的方法名(updatePoint))。之后就要进行数据的回填,用post提交,写入要回填的路径(控制器中要进行数据回填的方法名),待发送 Key/value 参数(注意:前面一个(key)要与控制器接收数据的名称一致),然后调用方法。在方法中调用方法loadDatatoForm进行数据回填(在调用该方法时,传入的from表单的ID不能加#,)。弹出模态框。设置点击模态框外的背景无效、按键盘的ese键也无效。即除点击关闭按钮外其他方式都不能关闭模态框。

   //打开修改模态框
       function updatePoint(PointID) {
           //重置表单
           $("#fromPoint")[0].reset();
           //标题
           $("#modalPointTitle").text('修改知识点');
           //action
           $("#fromPoint").prop("action", "updatePoint")

           //回填数据
           //打开加载层
           layIndex = layer.load();
           $.post("huiTianPoint", { PointID: PointID }, function (data) {
               layer.close(layIndex);
               loadDatatoForm("fromPoint", data);
           }, 'json');

           //弹出模态框
           $("#modalPoint").modal({ backdorp: "static", keyboard: false });

       }

控制器代码—进行数据回填
创建方法huiTianPoint,并用和视图中回填数据传入的参数名称一样的名称来接收要修改表格主键的知识点ID(PointID)。由于在这里的数据回填是单条数据的查询,所以必然伴随着捕获异常的try{} catch{}。根据接收到的视图中的PointID在知识点表(SYS_Point)中查询查询出对应PointID的数据并以json格式返回到视图中。如果出现异常,则返回null。

    public ActionResult huiTianPoint(int PointID)
       {
           try
           {
               SYS_Point varPoint = (from tbPont in myModels.SYS_Point
                                     where tbPont.PointID == PointID
                                     select tbPont).Single();

               return Json(varPoint, JsonRequestBehavior.AllowGet);
           }
           catch (Exception e)
           {
               Console.Write(e);
               return Json(null, JsonRequestBehavior.AllowGet);
           }
       }

进行数据回填的方法:loadDatatoForm
在该方法中传入两个参数:formId:form表单id 、jsonDate:json对象,从控制器返回的数据。声明变量obj来接收json对象的数据,声明一些临时变量(key, value, tagName, type, arr;),下面要用的。然后for循环json对象,将json对象的key赋予声明的临时变量key,json对象的value赋予声明的临时变量value,获取该表单下name为上面获得的key的控件或者富文本、复选框("#" + formId + " [name=’" + key + “’],#” + formId + " [name=’" + key + “[]’]”),遍历循环获得的控件,获取该控件的tagName(标签名)并将其赋予声明的临时变量tagName,获取获取该标签中的type(如单选按钮’radio’、复选框’checkbox’),并将其赋予声明的临时变量type,然后判断该标签是否为input标签(if (tagName == ‘INPUT’)),若是input标签,则判断给类型是否为单选按钮(radio)类型,若为单选按钮,利用prop,直接将value中的值赋予单选框的value,返回给单选框。若该值为false,则没选中,反之,若为true,则已选中。若为复选框,value存在多个值或单个。若为多个:根据每个值之间的“,”分割value,并令其让临时变量arr接收并以数组的形式存在。for循环数组arr,将value中的第i个值赋予给该复选框的value值。若该值为true,继续循环,为false,跳出循环。若为单个:用attr直接返回value的值。若是input标签的其他类型,直接将value中的值赋予input标签的value。若得到的控件的标签名为’TEXTAREA’,也就是文本域:直接将value赋值给文本域的value值。若得到的控件的标签名为’SELECT’,也就是下拉框:直接将value赋值给下拉框的value值

function loadDatatoForm(formId, jsonDate) {
   var obj = jsonDate;
   var key, value, tagName, type, arr;
   for (x in obj) {//循环json对象
       key = x;
       value = obj[x];
       //$("[name='"+key+"'],[name='"+key+"[]']").each(function(){
       //根据form表单id 和 json对象中的key查找 表单控件
       $("#" + formId + " [name='" + key + "'],#" + formId + " [name='" + key + "[]']").each(function () {
           tagName = $(this)[0].tagName;
           type = $(this).attr('type');
           if (tagName == 'INPUT') {
               if (type == 'radio') {
                   $(this).prop('checked', $(this).val() == value);
               } else if (type == 'checkbox') {
                   try {
                       //数组
                       arr = value.split(',');
                       for (var i = 0; i < arr.length; i++) {
                           if ($(this).val() == arr[i]) {
                               $(this).prop('checked', true);
                               break;
                           }
                       }
                   } catch (e) {
                       //单个
                       $(this).attr('checked', value);
                   }
               } else {
                   $(this).val(value);
               }
           } else if (tagName == 'TEXTAREA') {
               $(this).val(value);
           } else if (tagName == 'SELECT') {
               //console.log($(this).hasClass("select2"));
               if ($(this).hasClass("select2")) {
                   //select2 插件的赋值方法
                   $(this).val(value).trigger("change");
               } else {
                   $(this).val(value);
               }

           }

       });
   }
}

JS部分—保存修改
给保存按钮写点击事件,调用方法。根据id为PointName(知识点)获取该input标签的值(即输入的修改后的知识点)并用变量PointName来接收。判断PointName是否为空、undefined、null,若满足任何一个,输出:请填写完整。若不满足,继续往下执行。用ajaxSubmit()提交表单(不了解可见linq新增之多表新增)。用data接收控制器返回的数据,判断控制器返回数据中的state(状态)是否为true。若为true,刷新表格,关闭模态框,输出state为true时返回的文本,反之,输出state为false时返回的文本。(由于layer是Layui插件中的,因此若没有使用Layui插件则将含有layer的提示都改为不含layer的提示)

//保存新增/修改
       $("#btnSavePoint").click(function () {
           var PointName = $("#PointName").val();
           if (PointName != null && PointName != undefined && PointName != "")
           {
               layIndex = layer.load();
               $("#fromPoint").ajaxSubmit(function (data) {
                   layer.close(layIndex);
                   if (data.State) {
                       tabPoint.reload();
                       //关闭模态框
                       $("#modalPoint").modal('hide');
                       layer.alert(data.Text, { icon: 1, title: "提示" });
                   } else {
                       layer.alert(data.Text, { icon: 2, title: "提示" });
                   }
               })
           } else {
               layer.alert("请输入要新增的内容!", { icon: 0, title: "提示" });
           }
       })

修改的核心语句:
实例化Models的名称. Entry(表对象).State= System.Data.Entity.EntityState.Modified;
或者在最上方引用 System.Data.Entity也就是写(using System.Data.Entity)
然后: 实例化Models的名称. Entry(表对象).State= EntityState.Modified;
示例:myModels.Entry(sysPoint).State = System.Data.Entity.EntityState.Modified;
或 myModels.Entry(sysPoint).State = EntityState.Modified;

控制器代码—保存修改
创建保存修改的方法updatePoint, 用表对象来接收页面传过来的数据并用sysPoint接收,注意,这个表为要修改的表,因为页面两个input标签的name该表对应的实体类中对应的字段一致。实例化一个ReturnJsonVo(详情可见linq新增之单表新增),将其命名为returnJson,用来返回状态和文本。由于ReturnJsonVo中的state为bool,而bool类型默认为false,所以returnJson中的state默认为false。捕获异常,出现异常,输出文本。然后将sysPoint中的PointName去空格并用sysPoint中的PointName接收去空格后的数据。判断该数据是否为空,若为空,输出文本。在数据库中查询数据库中是否有对应的知识点名称,若有,输出文本。若无,保存数据。myModel.SaveChanges()为保存数据。所以判断,如果myModel.SaveChanges()>0,则表示修改成功,设置returnJson的状态为true,并返回文本:修改成功。反之返回文本:修改失败。最后,用Json格式将returnJson返回,并设置允许请求。

public ActionResult updatePoint(SYS_Point sysPoint)
       {
           ReturnJsonVo returnJson = new ReturnJsonVo();
           try
           {
               sysPoint.PointName = sysPoint.PointName.Trim();
               if (!string.IsNullOrEmpty(sysPoint.PointName))
               {
                   var PointCount = (from tbPoint in myModels.SYS_Point
                                     where tbPoint.PointName.Trim() == sysPoint.PointName
                                     select tbPoint).Count();
                   if (PointCount == 0)
                   {
                       myModels.Entry(sysPoint).State = EntityState.Modified;
                       if (myModels.SaveChanges() > 0)
                       {
                           returnJson.State = true;
                           returnJson.Text = "修改成功!";
                       }
                       else
                       {
                           returnJson.Text = "修改失败!";
                       }
                   }
                   else
                   {
                       returnJson.Text = "已存在相同的知识点!";
                   }
               }
               else
               {
                   returnJson.Text = "请填写完整!";
               }
           }
           catch (Exception e)
           {
               Console.Write(e);
               returnJson.Text = "参数异常!";
           }
           return Json(returnJson, JsonRequestBehavior.AllowGet);
       }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值