对象化前端表单(Form)提交
很常见的业务场景,就是前端一个表单,submit给后台,在web.form时代,有from 的runat="server" 配合submit 自动会提交给服务端,然后服务端解析Request装填对象。 如果要是异步提交的话,就麻烦点,from表单不会自动把你的所有value传给后台,于是就一个一个获取value值,通过json对象异步提交给后台,然后再由后台一个一个解析,再封装给对象。
- $.post("Handler1.ashx", { Name: $("#txtName").val(), Age: $("#txtAge").val() }, function (res)
- {...})
很庆幸的是上面只有2个参数,如果需要提交有10多个参数的话,用这种方法相信大家都有手疼的感觉。
幸亏在jquery上有serializeArray方法,可以不关心表单内容,只要有name属性,就会直接匹配value或者test值,生成一个json对象。如下:
- <form id="createStudent_form" runat="server">
- <table>
- <tr><td>Name:</td><td><input type="text" name="Name" /></td></tr>
- <tr><td>Address:</td><td><input type="text" name="Address" /></td></tr>
- <tr><td>Sex:</td><td>男<input type="radio" name="Sex" value="1" /> 女<input type="radio" name="Sex" value="0" /></td></tr>
- <tr><td>Remark:</td><td><textarea name="Remark"></textarea></td></tr>
- <tr><td><input type="button" value="submit" id="submit_btn" /></td></tr>
- </table>
- </form>
- <script src="Scripts/jquery-1.10.2.min.js"></script>
- <script>
- $(function () {
- $("#submit_btn").click(function () {
- var json = $("#createStudent_form").serializeArray();
- console.log(JSON.stringify(json));
- });
- })
</script>
点击提交表单,打印出来的结果是:
- [{"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),剩下的就需要咱们自己扩展了。简单改造如下:
- $.fn.serializeJson = function () {
- var resultJson = {};
- var array = this.serializeArray();
- $(array).each(function () {
- resultJson[this.name]=this.value;
- });
- return resultJson;
- };
serializeJson
通过上面的方法就得到了咱们想要的结果集了,但是这只是最基本的扩展,你可以继续深化比如支持相同内容的多个表单提交,支持相同name的多选框等等。
咱们异步提交给后端看看:
- $("#submit_btn").click(function () {
- var StudentModel = $("#createStudent_form").serializeJson();
- console.log(JSON.stringify(StudentModel));
- $.post("Handler1.ashx", StudentModel, function (res) {
- }).error(function ()
- { alert("error!") })
- });
- })
异步提交
相信到了这一步后,用过Mvc的小伙伴们看了一下子就兴奋起来了,因为Action会自动转化类型,只要你在后台定义过一个StudentModel对象,其参数和name一致,然后不用关系Requset就可以直接拿到了对象的值,这简直是爽呆了,几乎是太简单了。如下:
希望能多少给你点帮助。
最后再反向操作下,给了Json对象 ,如何自动把值赋给表单中的元素:
数据源:
- public ActionResult Index()
- {
- return View();
- }
- public ActionResult LoadAll()
- {
- List<Test> list = new List<Test>();
- Test test1 = new Test() {
- Id=1,
- Name="xxx",
- Title="xxx",IsCheck=false,
- ClassId=1
- };
- list.Add(test1);
- return Json(list);
- }
- }
- public class Test
- {
- public int Id { get; set; }
- public string Name { get; set; }
- public string Title { get; set; }
- public bool IsCheck { get; set; }
- public int ClassId { get; set; }
- }
前端:
- <script>
- $(function () {
- load();
- })
- function syncJsonTofrom($form,entity)
- {
- for (var key in entity) {
- var $control = $form.find("[name=" + key + "]");
- if ($control) {
- if ($control.attr("type") == "checkbox" && entity[key]) {
- $control.attr("checked", true);
- }
- $control.val(entity[key]);
- }
- }
- }
- function load() {
- $.post("/Test/LoadAll", function (res) {
- var entity = res[0];
- syncJsonTofrom($("#frm"),entity);
- })
- }
- </script>
- <form id="frm">
- ID:
- <input type="text" name="Id" />
- NAme:
- <input type="text" name="Name" />
- Title
- <input type="text" name="Title" />
- Ischeck<input type="checkbox" name="IsCheck" />
- class
- <select name="ClassId">
- <option value="0">xxx</option>
- <option value="1">222
- </option>
- <option value="2">222333
- </option>
- </select>
- </form>
对象化前端表单(Form)提交的更多相关文章
- mvc表单Form提交 --实体
1.方式1:字段加验证 @model MvcWeb.Models.UserInfo @{ ViewBag.Title = "Add"; } <h2>Add</h2 ...
- 使用ajax方法实现form表单的提交(附源码)
写在前面的话 在使用form表单的时候,一旦点击提交触发submit事件,一般会使得页面跳转,页面间的跳转等行为的控制权往往在后端,后端会控制页面的跳转及数据传递,但是在某些时候不希望页面跳转,或者说 ...
- 使用ajax方法实现form表单的提交
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 写在前面的话 在使用form表单的时候,一旦点击提交触发submit ...
- MVC身份验证.MVC过滤器.MVC6关键字Task,Async.前端模拟表单验证,提交.自定义匿名集合.Edge导出到Excel.BootstrapTree树状菜单的全选和反选.bootstrap可搜索可多选可全选下拉框
1.MVC身份验证. 有两种方式.一个是传统的所有控制器继承自定义Control,然后再里面用MVC的过滤器拦截.所以每次网站的后台被访问时.就会先走入拦截器.进行前端和后端的验证 一个是利用(MVC ...
- 1、前端--HTML简介、head内常见标签、body内常见标签(特殊符号、div、span、a、img、列表、表格table、表单form)、标签两大属性
今日内容 HTML简介 HTML是构造网页的骨架>>>:几乎所有的网站都是由HTML构建而成 HTML:超文本标记语言 # 不是一门编程语言 没有任何的逻辑 只有固定的标记功能 &q ...
- 前端表单标签form 及 简单应用
今日内容 form 表单(重点) 后端框架之 flask 简介 内容详细 form 表单 1.作用 form 表单可以在前端获取用户输入的数据并发送给后端(服务端) 2.input 标签 获取用户数据 ...
- 使用jQuery.form插件,实现完美的表单异步提交
传送门:异步编程系列目录…… 时间真快,转眼一个月快结束了,一个月没写博客了!手开始生了,怎么开始呢…… 示例下载:使用jQuery.form插件,实现完美的表单异步提交.rar 月份的尾巴,今天的主 ...
- js阻止form表单重复提交
防止表单重复提交的方法总体来说有两种,一种是在js中阻止重复提交:另一种是在后台利用token令牌实现,大致思路是生成一个随机码放到session和form表单的隐藏输入框中,提交表单时两者对比,表单 ...
- 表单 - Form - EasyUI提供的表单异步提交
方案一 被提交的表单 <form id="loginForm" method="post"> <table align="cente ...
随机推荐
- mybatis 中${}和#{}区别
用#传入参数是,sql语句解析是会加上"",比如 select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是 ...
- eclipse @override注解出错
在工程中新建了一个接口,定义了一个methodA,然后写一个接口类实现该方法,并加上@override注解 项目提示@override出错,必须覆盖原方法XXX,解决办法 1)项目右键-project ...
- jquery mobile radio,checkbox button 样式设置
<label><input type=checkbox ></label>,<input type=checkbox id="checkbox &q ...
- 前端模板之EasyUI常用控件及参数
CSS类定义 div easyui-window window窗口样式 属性如下: 1) modal:是否生成模态窗口.true[是] false[否] 2) shadow:是否显示窗口阴影.true ...
- Google Font字体本地化使用提高网站访问速度
Google Web font在国内经常不稳定,速度在国内延迟也很高,而引发网页打开速度慢. 一.常见的字体格式介绍 不同的浏览器对字体格式支持是不一致的,常见的如下: 1.TureTpe(.ttf) ...
- ssh 服务器之间公钥认证方式的配置
前言 项目中需要编写脚本在服务器之间上传或者下载文件,但没有相关服务器来测试脚本,于是就着手安装两台server,然后用ssh的相关命令去配置server之间公钥认证登录. 步骤 1. 在VM Box ...
- EF4.1DbContext使用现成的数据库
在配置文件中使用 <configuration> <connectionStrings> <add name="BlogDB" providerNam ...
- 未能加载文件或程序集“Microsoft.SQLServer.DTSRuntimeWrap”或它的某一个依赖项。试图加载格式不正确的程序。
只要将应用程序池中的是否启用32位应用程序改为支持就可以了
- linux shell 常用表达式汇总
1. linux shell 逻辑运算符.逻辑表达式详解: http://www.cnblogs.com/chengmo/archive/2010/10/01/1839942.html
- 【SSM 6】Spring+SpringMVC+Mybatis框架搭建步骤
一.整体概览 首先看maven工程的创建 二.各层的文件配置 2.1,SSM父工程 <span style="font-family:KaiTi_GB2312;font-size:18 ...