zoukankan      html  css  js  c++  java
  • 对象化前端表单(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":"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),剩下的就需要咱们自己扩展了。简单改造如下:

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

      

      

      

  • 相关阅读:
    【转】【SEE】基于SSE指令集的程序设计简介
    【转】【Asp.Net】asp.net服务器控件创建
    ControlTemplate in WPF ——ScrollBar
    ControlTemplate in WPF —— Menu
    ControlTemplate in WPF —— Expander
    ControlTemplate in WPF —— TreeView
    ControlTemplate in WPF —— ListBox
    ControlTemplate in WPF —— ComboBox
    ControlTemplate in WPF —— TextBox
    ControlTemplate in WPF —— RadioButton
  • 原文地址:https://www.cnblogs.com/lpfsky/p/3634209.html
Copyright © 2011-2022 走看看