• 前端传值给后台的若干种方式


    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);
            }

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

  • 相关阅读:
    GitLabCI系列之流水线语法
    ssh访问控制,阻断异常IP,防止暴力破解
    天翼云主机高可用的两种办法
    kvm命令管理虚拟机
    kvm安装windows使用virtio驱动
    kvm上已安装的虚拟机修改为桥接网络
    监控Redis集群,有两种方法
    vivo 公司 Kubernetes 集群 Ingress 网关实践
    KVM里安装不是原装的winxp系统镜像
    kvm里的虚拟机硬盘和网卡使用virtio驱动
  • 原文地址:https://www.cnblogs.com/Benjamin/p/3414449.html
Copyright © 2020-2023  润新知