zoukankan      html  css  js  c++  java
  • 前端传值给后台的若干种方式

    1、最原始的表单方式

    前端:

    <form action="/library/test" method="POST">
           <input id="Name" name="Name" type="text" value="">
           <input id="Id" name="Id" type="text" value="">
           <input type="submit" value="Save" />
    </form>

    后台:

           [HttpPost]
            public ActionResult Test(FormCollection fc)
            {
     Person person=new Person(){Id = fc["Id"], Name = fc["Name"]};

    return Json(person.Id+" "+person.Name, JsonRequestBehavior.AllowGet); }

    2、使用MVC默认的模型绑定

     [HttpPost]
            public ActionResult Test(Person person)
            {
               return Json(person.Id+" "+person.Name, JsonRequestBehavior.AllowGet);
            }

    当前端发送数据后,person已经被填充了

    因为在MVC中,Person会默认绑定到后台的参数类型(模型绑定器会去去在请求的各种数据中查找对应的上的字段,若找到,则相应的数据到参数person里面)

    3、自定义modelbinder绑定

    首先,需要一个实现了IModelBinder接口的类,这个类的作用是依据需求,自定义从请求的各种数据(包括表单、URL Query String字)中去查找要填充的值。这些请求数据位于IValueProvider中

        public class PersonModelBinder : IModelBinder
        {
            public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
            {
                IValueProvider provider = bindingContext.ValueProvider;
                return new Person
                           {
                               Id = provider.GetValue("Name").AttemptedValue,   //本例中将位于valueProvider请求的数据中key为Name的值赋给Id
                               Name = provider.GetValue("Id").AttemptedValue
                           };
            }
        }

    然后创建一个特性类,该类实现了CustomModelBinderAttribute

        public class PersonBinderAttribute : CustomModelBinderAttribute
        {
            public override IModelBinder GetBinder()
            {
                return new PersonModelBinder();
            }
        }

    最后,使用时,在Person参数前,加上刚刚自定义的特性[PersonBinder]

           [HttpPost]
            public ActionResult Test([PersonBinder]Person person)
            {
               // AddIntoDb(person);
               return Json(person.Id+" "+person.Name, JsonRequestBehavior.AllowGet);
            }

    效果:

    这样的绑定效果,甚至直接通过访问http://localhost:11169/library/test?name=Benjamin&id=11223,后台的person也能被填充。

    原因是模型绑定器通过valueprovider查找了Url QueryString中相匹配的参数。

    4、通过手动序列化和反序列化

    前端:

    <script type="text/javascript">
        $(function () {
            var person = new Object();
            person.Id = "112233";
            person.Name = "Benjamin";
            var personStr=JSON.stringify(person);   //使用json2.js的序列化方法
            $.ajax({
                url: window.UrlContent("/Library/Test?tick=" + Math.random()),
                data: { personStr: personStr },
                type: "POST",
                success: function (result) {
                }
            });
        });
    </script>

    后台使用Newtonsoft.Json dll 的方法反序列化

     public ActionResult Test(string personStr)
            {
               Person person=JsonConvert.DeserializeObject<Person>(personStr);
               return Json(person.Id+" "+person.Name, JsonRequestBehavior.AllowGet);
            }

    这种方法的优点是,在前端装配数据时自由度比较大,数据来源不需要仅从表单元素中获取。

  • 相关阅读:
    spring jdbc和spring mybatis没什么很大的区别,为什么要用mybatis优势在哪里
    spring概述及环境搭建
    一些关于使用分区视图的好主意(转)
    正确选择排序提高查询性能(转)
    线程池的原理和连接池的原理
    编程式事务造成的系统频繁Down机的前后
    《Oracle 高效设计》 读书思考标量子查询查询性能讨论
    ORACLE自动备份方法(转)
    Oracle 10gR2 行变列研究
    索引组织表IOT(转)
  • 原文地址:https://www.cnblogs.com/Benjamin/p/3414449.html
Copyright © 2011-2022 走看看