• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

如何使用jQuery向asp.netMvc传递复杂json数据-Filter篇

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

上一篇使用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>,只能使用普通数组方式。

 

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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
asp.net解决程序运行过慢的问题发布时间:2022-07-10
下一篇:
如何解决ASP.NET中的文件上传大小限制的问题发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap