• 对象化前端表单(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>
    

      

      

      

  • 相关阅读:
    cmake默认变量
    关于字符编码
    cmake 变量
    动态库对外暴露api的方法
    vs2013工程技巧
    大学毕业4年-未来展望(1)-商业研究
    大学毕业4年-未来展望-序
    大学毕业4年-未来展望-序
    大学毕业4年-回顾和总结(3)-投资理财观-图穷而真相现
    大学毕业4年-回顾和总结(3)-投资理财观-图穷而真相现
  • 原文地址:https://www.cnblogs.com/lpfsky/p/3634209.html
Copyright © 2020-2023  润新知