应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

layer弹窗+ef引入独立页面进行操作

9948人阅读 2019/4/29 11:31 总访问:5182923 评论:3 收藏:0 手机
分类: 前端


使用layer弹窗进行操作的时候我们可以使用type=2,来把一个独立的页面指向content内容


例如我们有一个表格,点击添加后,我们可以单独创建一个视图来做添加

  1.   $(".adda").click(function ({
  2.             layer.open({
  3.                 title"添加",
  4.                 type2,
  5.                 skin"layui-layer-molv",
  6.                 area: ["550px""320px"],
  7.                 /*指定添加的页面*/
  8.                 content: "/home/addview",
  9.                 yesfunction ({
  10.                 },
  11.                 btn: ["确定"]
  12.             });
  13.         });

/home/addview就是一个独立的视图,里边就是放了一些输入框,以便用户输入


弹出效果如下:

其实就是生成了一个Iframe而已,所以里边的内容其实就是一个iframe。

tip:我这个界面用的是bootstrap,由于iframe是独立的页面需要相关的样式还是需要引入一下


由于我们现在添加的页面独立出来了,所以我们点击确定的时候,就需要调用添加页面里边的方法

这里的思想应该是:添加的逻辑写到添加页面里边去

而不是点击确定后把添加的信息拿到引用他的页面然后在写添加逻辑

如果把添加逻辑写到引用他的页面去主要有两个不好的地方:

1:还要把一大堆添加的数据拿回来

2:通用性就差了,如果还有一个地方要使用,添加的逻辑就要重复编写了,本来使用独立的页面写就是为了降低耦合度。面向对象三大特征之一的封装就是指的要通用的逻辑要封装起来,不要在外面在去操作了


首先看看在添加视图里边的添加逻辑

  1.     //添加的逻辑(在独立的页面里)
  2.     var addway = function (success{
  3.         $.post('/home/AddUser', $("#opeform").formtojsonobj(), function (result{
  4.             success(result);
  5.         });
  6.     }

这个逻辑很简单就是把表单一句话序列化成json对象,然后回传使用ef添加就行了,非常的简单方便

只是要注意一下,我这里在addway里边传递了一个方法过来,是因为添加成后我要添加引入他的页面我添加成功了

然后引用他的页面知道后才可以做后续的操作,其实就是一个使用回调函数的逻辑,这里使用回调函数逻辑会清晰很多


当然这个逻辑是写到独立页面还是外面,也不是绝对的

关键是看你像要复用的是什么,如果想要复用的仅仅是那个可以编辑的界面效果,想要添加和更新就有那个的话,当然逻辑放到外面来更好,

如果想要复用整个功能的话自然是把具体逻辑写到里边去,当然还可以分得更细一点,达到两种情况都可以复用的效果。


然后我们只需要在引用他的页面调用一个addway方法就ok了

由于是跨iframe调用,所以我们需要通过Id拿到iframe对象后在调用方法

window.frames["id"].方法


所以在我们这里就这样就可以了

  1.  window.frames["layui-layer-iframe1"].addway(function (result{
  2.     if (result > 0) {
  3.          alert('添加成功');
  4.          location.href = "/home/index";
  5.      }
  6.  });

layui-layer-iframe1就是弹出层iframe的那个di

完整的弹出代码如下:

  1. $(".adda").click(function ({
  2.             layer.open({
  3.                 title"添加",
  4.                 type2,
  5.                 skin"layui-layer-molv",
  6.                 area: ["550px""320px"],
  7.                 content"/home/addview",
  8.                 yesfunction ({
  9.                     window.frames["layui-layer-iframe1"].addway(function (result{
  10.                         if (result > 0) {
  11.                             alert('添加成功');
  12.                             location.href = "/home/index";
  13.                         }
  14.                     });
  15.                 },
  16.                 btn: ["确定"]
  17.             });
  18.         });

当然如果那个这样的弹出层有多个,iframe的id写死不好,那么使用当前layer的对象,或者id去拿吧

弹窗iframe的name和id均为"layui-layer-iframe"+Index

这里用了两个回调函数,让子页面来调用


在说一下用独立页面更新的情况:

由于是更新我们需要把以前的值传递到输入框,传值大概有两种方法:

1:只传递一个id到独立页面,在后台查询一次数据库,然后把数据返回回来

     页面没有独立出来的时候就是使用的第二种,这里先说说第一种吧,在独立页面的情况下用得多一点

     传递id通过路由传递即可

     

    后台就用ef查询一下,然后model传值

  1. public ActionResult Update(int Id)
  2. {
  3.     oaEntities oae = new oaEntities();
  4.     Users users = oae.Users.Where(a => a.Id == Id).FirstOrDefault();
  5.     return View(users);
  6. }

 前台就用mvc的htmlhelper显示一下即可:

  1. <link href="~/media/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
  2. <link href="~/media/css/style.css" rel="stylesheet" />
  3. <script src="~/media/js/jquery-1.10.1.min.js" type="text/javascript"></script>
  4. @model EFLearn.Users
  5. <div style="width: 90%; margin: 50px auto" id="updatediv">
  6.     <form id="updateform">
  7.         <div class="row-fluid">
  8.             <div class="span6">
  9.                 <h4>用户</h4>
  10.                 <p>
  11.                     @Html.TextBoxFor(a => a.UserName, new { @class = "span12 m-wrap" })
  12.                 </p>
  13.                 <h4>学号</h4>
  14.                 <p>
  15.                     @Html.TextBoxFor(a => a.Number, new { @class = "span12 m-wrap" })
  16.                 </p>
  17.             </div>
  18.             <div class="span6">
  19.                 <h4>班级</h4>
  20.                 <p>
  21.                     @Html.TextBoxFor(a => a.UClass, new { @class = "span12 m-wrap" })
  22.                 </p>
  23.                 <h4>状态</h4>
  24.                 <p>
  25.                     @Html.DropDownListFor(a => a.CheckType, new List<SelectListItem>() { new SelectListItem(){Text="审核通过",Value="1"},
  26.                                                             new SelectListItem(){Text="正在审核",Value="2"},
  27.                                                             new SelectListItem(){Text="审核失败",Value="3"}
  28.                     })
  29.                 </p>
  30.             </div>
  31.         </div>
  32.     </form>
  33. </div>

选中状态那个如果不想用htmlhelper方式的话,直接通过js也很简单

2:不在请求后台,自己从前台获取值,然后传递到独立页面放入输入框即可

首先在独立的页面提供一个供传递参数的方法

  1. var inject = function (obj{
  2.     $("#updateform").injectValue(obj);
  3. }

然后在layer弹出的加载完成事件中调用这个方法,把组装好的json对象传递过去即可

这里说一下injectValue方法,这个是自己封装的一个jquery插件,可以直接通过一个表单给对象赋值,就不用一个一个点出来在通过选择器去赋值了,其实原理很简单,里边就是遍历一下json对象即可,也相当于就是遍历一个键值对。

大概样子就是这样

  1. $.fn.injectValue = function (obj{
  2.     for (var key in obj) {
  3.         $("#" + key).val(obj[key]);
  4.     }
  5. }


最后在说一点:

优点:代码耦合性低,功能独立写到一个页面,如果可能还可以重复利用

缺点:增加工作量,页面加载速度更慢,如果要做通用代码生成的话感觉也不是太好

所以还是业务逻辑复杂一点,功能多一点的操作单独提出来写吧,显得逼格都要高一点


吃饭啦,吃饭啦




欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

尘叶心繁

2019/5/2 23:25:43

看不懂看不懂,告辞告辞[赞]

饰心

2019/5/27 10:33:34

iframe 加载多了卡到炸


两点半:@饰心有一直调用Ajax吗?如果有个页面在循环调用,自然就会很卡,这是我遇到的

2019/7/30 17:52:15 回复

Vue.js+layer实现表格数据绑定与更新

一:使用Vue.js绑定好数据与更新事件 使用v-on绑定好事件,在事件里边直接把该行数据传递进去,在更新方法里边就可以直接...

layer.confirm 设置 询问框 的层遮盖

functionadmin_del(obj){ layer.confirm(&#39;确认要重启吗?&#39;,{ btn:[&#39;确定&#39;,&#39;取消&#39;]//按钮 },fun...

.net Core From DataBase layer To UI layer

Here we have created the database.OK,let&#39;s GO!First:You need create a new .net core to web application!And crea...

百度编辑器在layer弹窗中加载问题

因为加载到layer后百度编辑器要从新渲染一遍,所以如果使用setContent(Content)设置的内容在加载到layer弹窗中是显示不出来...

表格在layer弹窗中居中表格居中

其实很简单直接给table设置一个margin:top auto就可以了layer:layer.open({ type:1, title:&quot;更新&quot;, area:[&qu...

layer loading。layui 菊花

layer loading层很简单,起到一个遮罩提示加载的效果打开://loading层 varlayerIndex=layer.load(1,{ shade:[0.1,&#39;#...

layer加载完成事件

code:layer.open({ type:2 ,content:&#39;url&#39; ,success:function(){ alert(&#39;加载完成&#39;) } });

layer赋值

使用layer的时候注意content赋值的时候可能会存在两份一般解决这种问题有两种做法: 想办法让他只有一份给layer赋值的时候...

layer设置area后按钮掉下来

如果页面一加载就弹出layer,layer设置area后按钮就会掉下来,感觉也这算layer的一个bug可以把高度设置成auto按钮就不会掉下...

layer弹窗i获取id

直接贴代码,这个实在yes回调函数里边执行的,通过index去找 yes: function (index) { var nowLayer = $(&quot;#layui-lay...

layer弹窗放jquery对象被遮住了

html &lt;div id=&quot;showcontent&quot; style=&quot;display: none&quot;&gt; hello layer &lt;/div&gt; js: l...

layer没有垂直居中的问题

解决方法1:在页面的顶部加上:&lt;!DOCTYPE html&gt;

layui中使用layer

直接这样既可:layui.use(&#39;layer&#39;,function(){ varlayer=layui.layer; layer.msg(&#39;hello&#39;); });

使用dplayer进行视频播放

贴个小demo:&lt;!DOCTYPEhtml&gt; &lt;html&gt; &lt;head&gt; &lt;metaname=&quot;viewport&quot;content=&quot;width...

layer表格点击事件获取当前top以left

直接上代码吧 var t = obj.tr.find(&quot;td[lay-event=&#39;Title&#39;]&quot;).offset().top + obj.tr.find(&quot;td[lay...