zoukankan      html  css  js  c++  java
  • 如何使用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>,只能使用普通数组方式。

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

  • 相关阅读:
    跃迁方法论 Continuous practice
    EPI online zoom session 面试算法基础知识直播分享
    台州 OJ 2648 小希的迷宫
    洛谷 P1074 靶形数独
    洛谷 P1433 DP 状态压缩
    台州 OJ FatMouse and Cheese 深搜 记忆化搜索
    台州 OJ 2676 Tree of Tree 树状 DP
    台州 OJ 2537 Charlie's Change 多重背包 二进制优化 路径记录
    台州 OJ 2378 Tug of War
    台州 OJ 2850 Key Task BFS
  • 原文地址:https://www.cnblogs.com/cask118/p/1732565.html
Copyright © 2011-2022 走看看