对象化前端表单(Form)提交

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

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

    很庆幸的是上面只有2个参数,若是须要提交有10多个参数的话,用这种方法相信你们都有手疼的感受。前端

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

 <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>

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

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

  一看是个json 对象数组,除了第一个是webForm独有的shit东西之外,其余你们一眼能够看出来是name,value两个键值对相匹配。这与咱们想要获得的格式{name:value}还不太一致,固然jquery作到这一步已经不错了(其实内部实现原理也不难,拿到表单一一遍历组成Json),剩下的就须要我们本身扩展了。简单改造以下:web

 $.fn.serializeJson = function () {
            var resultJson = {};
            var array = this.serializeArray();
            $(array).each(function () {
                resultJson[this.name]=this.value;
            });
            return resultJson;
        };
serializeJson

   经过上面的方法就获得了我们想要的结果集了,可是这只是最基本的扩展,你能够继续深化好比支持相同内容的多个表单提交,支持相同name的多选框等等。json

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

 $("#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对象 ,如何自动把值赋给表单中的元素:ide

 数据源:

  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>
相关文章
相关标签/搜索