• 如何使用jQuery向asp.net Mvc传递复杂json数据Filter篇


    上一篇使用ModelBinder解决了asp.net Mvc下接收使用jQuery异步提交复杂对象参数的问题;

    在asp.net Mvc框架下,解决问题的方法并不是唯一的,只要在Action方法真正本调用之前,对Context.ActionParameters对象中的参数进行处理,就能解决此问题。

    下面的代码是使用ActionFilter处理参数。

     

    首先,把要提交的对象参数序列化成字符串,再异步提交:

                /*按钮点击事件*/
                $(
    "#btn_post_test").click(function() {
                    
    var data = {
                        UserId: 
    "11",
                        UserName: { FirstName: 
    "323", LastName: "2323" },
                        Keys: [
    "xiaoming""xiaohong"]
                    };

                    $.post(
    "Home/TestFilter", { user: String.toSerialize(data) }, function(text) {
                        alert(String.toSerialize(text));
                    }, 
    "json");
                });


    在Action添加属性,对参数进行预处理:

            /// <summary>
            
    /// Filter处理参数测试方法
            
    /// </summary>
            
    /// <param name="user"></param>
            
    /// <returns></returns>
            [JsonFilter(typeof(User), "user")]
            
    public ActionResult TestFilter(User user)
            {
                
    //输入接收到的参数的json字符串
                return Json(user, JsonRequestBehavior.AllowGet);
            }


    Filter代码,对参数反序列化,转换成对象:

        /// <summary>
        
    /// json参数处理类
        
    /// </summary>
        public class JsonFilterAttribute : ActionFilterAttribute
        {
            
    /// <summary>
            
    /// 构造方法
            
    /// </summary>
            
    /// <param name="type">参数类型,如果是数组请输入数组元素类型</param>
            
    /// <param name="modelName">参数名称</param>
            public JsonFilterAttribute(Type type, string modelName)
            {
                DataType 
    = type;
                ModelName 
    = modelName;
            }

            
    protected Type DataType { getset; }

            
    protected string ModelName { getset; }
            
    /// <summary>
            
    /// 参数转换处理
            
    /// </summary>
            
    /// <param name="filterContext"></param>
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                
    //获取客户端提交的字符串
                string json = filterContext.HttpContext.Request.Form[ModelName];
                
    //判断提交对象是object对象还是Array对象
                if (json.StartsWith("{"&& json.EndsWith("}"))
                {
                    
    //object对象反序列化
                    JObject jsonBody = JObject.Parse(json);
                    JsonSerializer js 
    = new JsonSerializer();
                    
    object obj = js.Deserialize(jsonBody.CreateReader(), DataType);
                    filterContext.ActionParameters[ModelName] 
    = obj;
                }
                
    if (json.StartsWith("["&& json.EndsWith("]"))
                {
                    
    //Array对象反序列化
                    ArrayList list = new ArrayList();
                    JArray jsonRsp 
    = JArray.Parse(json);
                    
    if (jsonRsp != null)
                    {
                        
    for (int i = 0; i < jsonRsp.Count; i++)
                        {
                            JsonSerializer js 
    = new JsonSerializer();
                            
    object obj = js.Deserialize(jsonRsp[i].CreateReader(), DataType);
                            list.Add(obj);
                        }
                    } 
                    filterContext.ActionParameters[ModelName] 
    = list.ToArray(DataType);
                }
            } 
        }


     使用Filter处理参数与ModelBinder的方式有一个不一致的地方,由于Filter不能使用泛型,接收数组参数是,不能转换成泛型数组对象IList<T>,只能使用普通数组方式。

    或许有更好的方式可以解决,但是我没发现。

  • 相关阅读:
    横冲直撞vue(第六篇):vue之过滤器、es6中填充字符串、es6新增的padStart()方法和padEnd()方法、vue自定义键盘修饰符、vue自定义全局指令
    leetcode的奇妙冒险(python3)系列:leetcode 283. Move Zeroes
    横冲直撞vue(第五篇):事件修饰符、指令系统综合案例
    横冲直撞vue(第四篇):v-model、指令系统总结、指令系统示例轮播图实现、指令系统示例跑马灯效果实现、在vue中使用样式的方式
    横冲直撞vue(第三篇):vue中template的三种写法、v-bind、v-on、更新元素的指令v-text与v-html、条件渲染指令v-if 与v-show、v-for
    横冲直撞vue(第二篇):什么是vue?框架和库的区别、vue的优点、vue的使用、使用vue实例化对象
    横冲直撞vue(第一篇):常用的ES6语法
    nodejs(第五篇):npm常用命令、包说明文件package.json、packjson-lock.json文件、使用nodemon插件、nrm的安装与使用
    最详细的个人博客教程搭建教程,最快5分钟快速搭建简约风格博客
    面试问了解Linux内存管理吗?10张图给你安排的明明白白!
  • 原文地址:https://www.cnblogs.com/stalwart/p/1779306.html
Copyright © 2020-2023  润新知