序言:
刚结束公司的三个月试用期,意味着我即将正式步入社会成为广大从事it行业的一员。作为一个编程小白,无论从技术层面还是知识层面都是比较薄弱的,想要成为一个优秀的程序员不断的学习与探索是不可避免的。我相信一切的付出与收获是成正比的!fighting!
这几天在做公司的实际项目的时候,需要实现选中bootstrap table中的任意一行数据点击编辑按钮弹出一个模态框以表单的形式对该行数据进行编辑。获取表格行的数据是比较方便的,具体可以查找bootstrap table参考文档,具体地址可以直接在浏览器中搜索关键字“bootstrap table”查找,也可以访问以下地址:http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/。表内的数据是获得了,那关键是怎样将表内数据传递到模态框中的表单呢?我们知道table内的数据是从后台传过来的,那模态框内表单数据不是也可以从后台直接拿!好了知道数据要从哪里来了,那现在我们需要解决的问题是怎样确定是表格中的哪条数据传到表单。表格中的每条数据都是有唯一标识的,可能是一个字段也可能是多个字段组成一个唯一的标识,我们就把它/它们当做是这行数据的key,我们在控制器中将这个key作为参数传到后台查找这个key对应的数据,这样要传递的数据也找到了。那就只剩将后台数据传输到前台了,想到后台与前台的传值那我们就需要用到ajax了,原生的ajax是比较复杂的,这里我们就使用jquery封装好的ajax,使用比较方便。数据是能传递到前台了,那数据怎样赋值给每个标签呢,毕竟数据不是智能的,不能自己对号入座。接下来就是比较好玩的东西了,自己写一个jquery方法判断前台标签的类型依次将标签中的name值赋值json对象对应的属性名字。json对象可以看做是一个键值对数组,只要获得键的名字,该键的值也能获得,这样前台的数据也能依次呈现出来。
后面我用一个小例子来模拟后台json数据填充form表单的过程,方便大家能更好的了解这个过程。以上描述与想法都是本人个人认知,写博客也是为了记录自己的学习收获与心得,存在错误或者偏差希望能得到各位前辈纠正和指导。
预备:
接下来我们演示的例子将会用到asp.net mvc 、jquery、ajax、bootbox、html等相关的知识,还不懂的小伙伴需要提前做一下功课。现在网上的学习资源很丰富,稍微花点时间还是能学到很多东西。asp.net mvc相关的知识可以在博客园中很多前辈的博客中学习。bootbox相关的可以直接去官方网站查看参考文档,具体地址可以直接在浏览器中搜索关键字“bootbox”查找,也可以访问以下地址:http://bootboxjs.com/documentation.html。其他相关的知识可以在浏览器中搜索关键字“w3school”查找,也可以直接访问以下地址:http://www.w3school.com.cn/。
项目介绍:
通过控制器创建一个index视图,写入下列html代码,这里我创建了一个分部视图,不创建直接写在同一个页面也是一样的效果。为了更加直观的显示数据传递时的页面变化我就不将分部视图外的“div”标签增加“hidden”属性。在正常的情况下,我们需要将原先页面分部视图中的form表单隐藏掉,因为使用了bootbox,在点击“full form”按钮时会自动生成一个模态框,里面克隆了表单内的所有元素内容。
1 <h2>jackson personal homepage</h2> 2 3 <div class="control-group"> 4 <label class="control-label">full form</label> 5 <btn id="btnget" class="btn btn-success">full form</btn> 6 </div> 7 8 <div> 9 @html.partial("_getform") 10 </div>
分部视图_getform.cshtml
1 <form class="form-horizontal" id="jsonform"> 2 3 <div class="control-group"> 4 <!-- name input--> 5 <label class="control-label">name</label> 6 <div class="controls"> 7 <input type="text" placeholder="input name please" name="name"> 8 </div> 9 </div> 10 11 <div class="control-group"> 12 <!-- age input--> 13 <label class="control-label">age</label> 14 <div class="controls"> 15 <input type="text" placeholder="input age please" name="age"> 16 </div> 17 </div> 18 19 <div class="control-group"> 20 <label class="control-label">gender</label> 21 <div class="controls"> 22 <!-- multiple radios --> 23 <label class="radio"> 24 <input type="radio" value="man" name="gender"> 25 handsome boy 26 </label> 27 <label class="radio"> 28 <input type="radio" value="woman" name="gender"> 29 beautiful girl 30 </label> 31 </div> 32 33 </div> 34 35 <div class="control-group"> 36 <!-- select basic --> 37 <label class="control-label">nationality</label> 38 <div class="controls"> 39 <select name="nationality"> 40 <option></option> 41 </select> 42 </div> 43 </div> 44 45 <div class="control-group"> 46 <!-- textarea --> 47 <label class="control-label">specialty</label> 48 <div class="controls"> 49 <div class="textarea"> 50 <textarea type="text" name="specialty"> </textarea> 51 </div> 52 </div> 53 </div> 54 55 </form>
我们需要传递一条json数据,所以我就在控制器中创建了一个person对象,将这个对象转成json格式来模拟,通过getjson()这个方法传递给前台。
1 [httppost] 2 public jsonresult getjson() 3 { 4 person person = new person() { name = "jackson", age = 24, gender = "man", nationality = "china", specialty = "attentive and patient" }; 5 return json(person); 6 }
前台调用getjson()方法,需要使用ajax,所以我们在前台写一个按钮的点击事件触发这个方法,将数据传递过来,然后将数据传入自己写的jquery方法,根据元素的类型判断依次为其赋对应的值,之后执行bootbox的dialog方法,将表单及数据通过模态框方式显示。
1 <script> 2 $("#btnget").click(function () { 3 $.ajax({ 4 url: "getjson", 5 type: "post", 6 datatype: "json", 7 success: function (data) { 8 $("#jsonform").populateform(data); 9 bootbox.dialog({ 10 title: "this is form :)", 11 message: $("#jsonform").clone(), 12 buttons: { 13 confirm: { 14 label: 'submit', 15 classname: 'btn-success' 16 }, 17 cancel: { 18 label: 'quit', 19 classname: 'btn-danger' 20 } 21 }, 22 }); 23 } 24 }) 25 }) 26 </script>
接下来是最关键的部分,是这个功能得以实现的核心,上述的代码中有一句“$("#jsonform”).populateform(data);”这里的populateform()就是自己定义的一个jquery方法,代码是参考了某位前辈的代码,只是做出稍微修改。如果分析的复杂一点完全可以封装成一个通用的jquery方法以满足不同的条件复用。以下代码写在一个名字为"getjsonform.js"的javascript文件中。
1 $.fn.populateform = function (data) { 2 return this.each(function () { 3 var formelem, name; 4 if (data === null) { this.reset(); return; } 5 for (var i = 0; i < this.length; i++) { 6 formelem = this.elements[i]; 7 name = formelem.name; 8 switch (formelem.type) { 9 case "radio": 10 if (data[name] === "") { 11 formelem.checked = false; 12 } else if (formelem.value === data[name]) { 13 formelem.checked = true; 14 } 15 break; 16 case "select-one": 17 formelem[0].value = data[name]; 18 if (data[name] === null) { 19 formelem[0].text = "--"; 20 } else { 21 formelem[0].text = data[name]; 22 } 23 break; 24 case "button": break; 25 default: 26 if (data[name] === null) { 27 formelem.value = "--"; 28 } else { 29 formelem.value = data[name]; 30 } 31 } 32 } 33 }); 34 };
确保getjsonform.js以及bootbox依赖的文件正确被引用(这里bootbox引用的是“bootbox.min.js”,可以在起官网下载)。
以上项目就完成了...
总结分析:
需要着重分析一下"getjsonform.js"里的代码,从分析的过程中我们能更加详细的知道其实现原理,便于之后的扩展与完善,封装成一个满足各种条件的方法。当前项目取得是一个单一的json对象,但是很多情况下json数据可能会更加复杂,而且我们这里只试验了对表单中其中几种常用类型的标签赋值,功能是不完善的。其中select标签的赋值方式也不是很完善,只能满足于与该项目相似的项目,完善还是需要花更多的时间。
以上是我在做项目时的获得的所有心得,可能不是很完善也存在很多错误,欢迎各位纠正。
ps:在做项目的时候遇到一个问题,就是bootbox文档里dialog方法中的"message"可以传html,当代码为:
$("jsonform”).html();
时模态框加载页面但是只有select标签下的option值被赋值了,其他值就是不显示,将代码改为:
$("jsonform”).clone();
时就全部显示正常了,这个问题仍然想不通...
百度云盘:链接:https://pan.baidu.com/s/1el1ftdhn2_hx9h99xmwlhq 密码:iuss
感兴趣的小伙伴可以自行下载(ide:visual studio 2017)
执行的结果
【代码为”$("jsonform”).clone();”时的结果】
【代码为”$("jsonform”).html();”时的结果】