很常见的业务场景,就是前端一个表单,submit给后台,在web.form时代,有from 的runat="server" 配合submit 自动会提交给服务端,然后服务端解析Request装填对象。 如果要是异步提交的话,就麻烦点,from表单不会自动把你的所有value传给后台,于是就一个一个获取value值,通过json对象异步提交给后台,然后再由后台一个一个解析,再封装给对象。

  1. $.post("Handler1.ashx", { Name: $("#txtName").val(), Age: $("#txtAge").val() }, function (res)
  2. {...})

很庆幸的是上面只有2个参数,如果需要提交有10多个参数的话,用这种方法相信大家都有手疼的感觉。

幸亏在jquery上有serializeArray方法,可以不关心表单内容,只要有name属性,就会直接匹配value或者test值,生成一个json对象。如下:

  1. <form id="createStudent_form" runat="server">
  2. <table>
  3. <tr><td>Name:</td><td><input type="text" name="Name" /></td></tr>
  4. <tr><td>Address:</td><td><input type="text" name="Address" /></td></tr>
  5. <tr><td>Sex:</td><td><input type="radio" name="Sex" value="1" /><input type="radio" name="Sex" value="0" /></td></tr>
  6. <tr><td>Remark:</td><td><textarea name="Remark"></textarea></td></tr>
  7. <tr><td><input type="button" value="submit" id="submit_btn" /></td></tr>
  8. </table>
  9.  
  10. </form>
  1. <script src="Scripts/jquery-1.10.2.min.js"></script>
  2. <script>
  3. $(function () {
  4. $("#submit_btn").click(function () {
  5. var json = $("#createStudent_form").serializeArray();
  6. console.log(JSON.stringify(json));
  7. });
  8. })
    </script>

点击提交表单,打印出来的结果是:

  1. [{"name":"__VIEWSTATE","value":"fO0ZxNMqIPEgrnZBjZiR5a97V4u8fbMcDpPStT/X97Cpp7vbUjNufjDdDOZHM9ey+6OYvgcTT5+6sQKR+z1cX2vB+INYHkDkWLSKiEgOuEI="},{"name":"Name","value":""},{"name":"Address","value":""},{"name":"Sex","value":""},{"name":"Remark","value":""},{"name":"__VIEWSTATEGENERATOR","value":"2D79A64A"}]

结果

一看是个json 对象数组,除了第一个是webForm独有的shit东西以外,其他大家一眼可以看出来是name,value两个键值对相匹配。这与我们想要得到的格式{name:value}还不太一致,当然jquery做到这一步已经不错了(其实内部实现原理也不难,拿到表单一一遍历组成Json),剩下的就需要咱们自己扩展了。简单改造如下:

  1. $.fn.serializeJson = function () {
  2. var resultJson = {};
  3. var array = this.serializeArray();
  4. $(array).each(function () {
  5. resultJson[this.name]=this.value;
  6. });
  7. return resultJson;
  8. };

serializeJson

通过上面的方法就得到了咱们想要的结果集了,但是这只是最基本的扩展,你可以继续深化比如支持相同内容的多个表单提交,支持相同name的多选框等等。

咱们异步提交给后端看看:

  1. $("#submit_btn").click(function () {
  2. var StudentModel = $("#createStudent_form").serializeJson();
  3. console.log(JSON.stringify(StudentModel));
  4. $.post("Handler1.ashx", StudentModel, function (res) {
  5. }).error(function ()
  6. { alert("error!") })
  7. });
  8. })

异步提交

相信到了这一步后,用过Mvc的小伙伴们看了一下子就兴奋起来了,因为Action会自动转化类型,只要你在后台定义过一个StudentModel对象,其参数和name一致,然后不用关系Requset就可以直接拿到了对象的值,这简直是爽呆了,几乎是太简单了。如下:

自定义实体转化

希望能多少给你点帮助。

最后再反向操作下,给了Json对象 ,如何自动把值赋给表单中的元素:

数据源:

  1. public ActionResult Index()
  2. {
  3. return View();
  4. }
  5. public ActionResult LoadAll()
  6. {
  7. List<Test> list = new List<Test>();
  8. Test test1 = new Test() {
  9. Id=1,
  10. Name="xxx",
  11. Title="xxx",IsCheck=false,
  12. ClassId=1
  13. };
  14. list.Add(test1);
  15. return Json(list);
  16. }
  17. }
  18. public class Test
  19. {
  20. public int Id { get; set; }
  21. public string Name { get; set; }
  22. public string Title { get; set; }
  23. public bool IsCheck { get; set; }
  24. public int ClassId { get; set; }
  25. }

  前端:

  1. <script>
  2. $(function () {
  3. load();
  4. })
  5.  
  6. function syncJsonTofrom($form,entity)
  7. {
  8. for (var key in entity) {
  9. var $control = $form.find("[name=" + key + "]");
  10. if ($control) {
  11. if ($control.attr("type") == "checkbox" && entity[key]) {
  12. $control.attr("checked", true);
  13. }
  14. $control.val(entity[key]);
  15. }
  16. }
  17. }
  18. function load() {
  19. $.post("/Test/LoadAll", function (res) {
  20. var entity = res[0];
  21. syncJsonTofrom($("#frm"),entity);
  22. })
  23.  
  24. }
  25. </script>
  26. <form id="frm">
  27. ID:
  28. <input type="text" name="Id" />
  29. NAme:
  30. <input type="text" name="Name" />
  31. Title
  32. <input type="text" name="Title" />
  33. Ischeck<input type="checkbox" name="IsCheck" />
  34. class
  35. <select name="ClassId">
  36. <option value="0">xxx</option>
  37. <option value="1">222
  38. </option>
  39. <option value="2">222333
  40. </option>
  41. </select>
  42. </form>

  

  

  

对象化前端表单(Form)提交的更多相关文章

  1. mvc表单Form提交 --实体

    1.方式1:字段加验证 @model MvcWeb.Models.UserInfo @{ ViewBag.Title = "Add"; } <h2>Add</h2 ...

  2. 使用ajax方法实现form表单的提交(附源码)

    写在前面的话 在使用form表单的时候,一旦点击提交触发submit事件,一般会使得页面跳转,页面间的跳转等行为的控制权往往在后端,后端会控制页面的跳转及数据传递,但是在某些时候不希望页面跳转,或者说 ...

  3. 使用ajax方法实现form表单的提交

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 写在前面的话 在使用form表单的时候,一旦点击提交触发submit ...

  4. MVC身份验证.MVC过滤器.MVC6关键字Task,Async.前端模拟表单验证,提交.自定义匿名集合.Edge导出到Excel.BootstrapTree树状菜单的全选和反选.bootstrap可搜索可多选可全选下拉框

    1.MVC身份验证. 有两种方式.一个是传统的所有控制器继承自定义Control,然后再里面用MVC的过滤器拦截.所以每次网站的后台被访问时.就会先走入拦截器.进行前端和后端的验证 一个是利用(MVC ...

  5. 1、前端--HTML简介、head内常见标签、body内常见标签(特殊符号、div、span、a、img、列表、表格table、表单form)、标签两大属性

    今日内容 HTML简介 HTML是构造网页的骨架>>>:几乎所有的网站都是由HTML构建而成 HTML:超文本标记语言 # 不是一门编程语言 没有任何的逻辑 只有固定的标记功能 &q ...

  6. 前端表单标签form 及 简单应用

    今日内容 form 表单(重点) 后端框架之 flask 简介 内容详细 form 表单 1.作用 form 表单可以在前端获取用户输入的数据并发送给后端(服务端) 2.input 标签 获取用户数据 ...

  7. 使用jQuery.form插件,实现完美的表单异步提交

    传送门:异步编程系列目录…… 时间真快,转眼一个月快结束了,一个月没写博客了!手开始生了,怎么开始呢…… 示例下载:使用jQuery.form插件,实现完美的表单异步提交.rar 月份的尾巴,今天的主 ...

  8. js阻止form表单重复提交

    防止表单重复提交的方法总体来说有两种,一种是在js中阻止重复提交:另一种是在后台利用token令牌实现,大致思路是生成一个随机码放到session和form表单的隐藏输入框中,提交表单时两者对比,表单 ...

  9. 表单 - Form - EasyUI提供的表单异步提交

    方案一 被提交的表单 <form id="loginForm" method="post"> <table align="cente ...

随机推荐

  1. 实践总结 - 不可错过的Angular应用技巧

    angular的核心思想是通过数据驱动一切,其他东西都是数据的延伸. 套用Javascript一切皆对象的思想,在angular中可以说一切皆数据. 关于项目构建 (1) requirejs以及Yeo ...

  2. linux下关于svn提交的时候强制写注释

    在svn版本库的hooks文件夹下面,复制模版pre-commit.tmpl cp pre-commit.tmpl pre-commit chmod 777 pre-commit 1 2 1 2 na ...

  3. Windows Server 2008配置服务器证书[转载]

    备忘 http://wangchunhai.blog.51cto.com/225186/139451

  4. mysql删造成表死锁研究

    现在互联网公司对于代码的管理越来越规范,一般都会有3个环境:开发环境,测试环境,正式环境.在开发环境进行开发,开发完成后将代码提交到测试环境进行测试,测试完毕后上线到正式环境. 今天在正式环境上遇到一 ...

  5. SQL语句之备份表

    SELECT INTO 语句:表示从一个表中选取数据,然后把数据插入另一个表中,常用来备份一张表 1.全表结构备份: SELECT * INTO new_table_name FROM old_tab ...

  6. DataTable

    //遍历datatable的方法2009-09-08 10:02方法一: DataTable dt = dataSet.Tables[]; ; i < dt.Rows.Count ; i++) ...

  7. [转]uboot中SPL作用

    转:http://blog.csdn.net/voice_shen/article/details/17373671 这篇文章写的非常详细 [u-boot: 2014.01-rc1] 本文将使用sam ...

  8. .NET加密方法

    SHA1加密: string[] ArrTmp = { Token, timestamp, nonce }; Array.Sort(ArrTmp);//字典排序 string tmpStr = str ...

  9. [hihoCoder1329] 带Split和Merge的Treap

    题目链接:http://hihocoder.com/problemset/problem/1329 这题本来是学Splay的题,但是我为了练习Treap的Split和Merge操作,就借来用一用. 就 ...

  10. 数据库使用--MyISAM InnoDB 区别

    MyISAM 和 InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处 ...