• 如何使用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>,只能使用普通数组方式。

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

  • 相关阅读:
    强化学习 | D3QN原理及代码实现
    Airtest入门及多设备管理总结
    JS图片base64压缩
    ABP框架
    .net gof23种设计模式
    VS2013添加Socket
    VS2013用InstallShield打包winfrom项目
    .net core3.1 log4net无法写日志
    git commit 修改提交说明信息
    screen 使用总结
  • 原文地址:https://www.cnblogs.com/cask118/p/1732565.html
Copyright © 2020-2023  润新知