JsonResult类型

本文详细介绍了ASP.NET MVC中JsonResult类的作用,以及如何使用JsonResult返回JSON格式的数据。JsonResult包含Data、ContentEncoding、ContentType等属性,并可以通过JsonRequestBehavior枚举控制HTTP-GET请求的支持。此外,还讲解了序列化过程中的JavaScriptSerializer类,以及Controller中的Json方法。最后,给出了一个登录示例,展示了如何在客户端通过Ajax与服务器进行JSON数据交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、介绍

      后台数据是通过二个基于某种CLR 类型的对象来承载的,当客户端调用某个Action 方法并希望以JSON 的格式返回请求的数据时, ASP.NET MVC 中

      System.Web.Mvc.J sonResult将CLR 对象转换成JSON 格式予以响应;

     返回JsonResult 类型,通过调用Json()方法返回Json格式数据到试图

二、源代码分析

     public class JsonResult : ActionResult
     {
        public override void ExecuteResult(ControllerContext context);
        public object Data { get; set; }
        public Encoding ContentEncoding { get; set; }
        public string ContentType { get; set; }
        public JsonRequestBehavior JsonRequestBehavior { get; set; }
        public int? MaxJsonLength { get; set; }
        public int? RecursionLimit { get; set; }
     }

     public enum JsonRequestBehavior
    {
        /// <summary>
        /// 支持HTTP-GET请求
        /// </summary>
        AllowGet,
        /// <summary>
        /// 不支持HTTP-GET请求
        /// 默认类型
        /// </summary>
        DenyGet
    }

                         Data属性:一个object 类型的属性,表示需要被转换成JSON 格式的数据对象;

             ContentEncoding:表示为当前响应设置的编码方式;

                     ContentType:表示为当前响应设置的媒体类型(默认采用的媒体类型为"applicaion/json");

 JsonRequestBehavior属性:开启对HTTP-GET 请求的支持,该属性是JsonRequestBehavior 枚举类型,

                                            两个枚举项AllowGetDenyGet(默认值) 分别表示允许/拒绝支持对HTTP-GET 请求的响应。

                                            (JsonResult 在默认的情况下不能作为对HTTP-GET 请求的响应,在这种情况下并会直接抛出一个InvalidOperationException异常,

                                             通过它的 JsonRequestBehavior 属性开启对HTTP-GET 请求的支持);

                 MaxJsonLength:被反序列化和序列化生成的JSON 字符串的长度,默认值为2097152 (Ox200000 ,等同于4MB 的Unicode 字符串数据);

                    RecursionLimit:用于设置被序列化对象和反序列化生成对象结构的允许的层级数,默认值为100;


   ExecuteResult()方法具体实现:

      public override void ExecuteResult(ControllerContext context)
        {
            //确认是否用于响应HTTP-GET 请求
            if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Compare(context.HttpContext.Request.HttpMethod, "GET", true) == 0)
            {
                throw new InvalidOperationException();
            }

            HttpResponseBase response = context.HttpContext.Response;
            //设直媒体类型和编码方式
            response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;
            if (this.ContentEncoding != null) { response.ContentEncoding = this.ContentEncoding; }

            //创建JavaScriptSerializer 将数据对象序列化成JSON 字符串并写入当前HttpResponse
            if (null == this.Data) return;
            JavaScriptSerializer serializer = new JavaScriptSerializer()
            {
                MaxJsonLength = this.MaxJsonLength.HasValue ? this.MaxJsonLength.Value : 0x200000,
                RecursionLimit = this.RecursionLimit.HasValue ? this.RecursionLimit.Value : 100
            };
            response.Write(serializer.Serialize(this.Data));
        }


三.  CLR 对象到JSON 格式字符串的序列化过程使用的对象:

       CLR 对象到JSON 格式字符串的序列化过程通过序列化器System.Web.Script. Serialization.JavaScriptSerializer 来完成。 JavaScriptSerializer 的SerializeDeserialize方法实现了CLR 对象的序列化和对JSON 字符串的反序列化。

         public class JavaScriptSerializer
        {
            // 序列化方法
           public string Serialize(object obj);
    
           // 反序列化方法
          public object Deserialize(string input, Type targetType);
       
          //被反序列化和序列化生成的JSON 字符串的长度,默认值为2097152 (Ox200000 ,等同于4MB 的Unicode 字符串数据)       
           public int MaxJsonLength { get; set; }
      
        //用于设置被序列化对象和反序列化生成对象结构的允许的层级数,默认值为100
       
        public int RecursionLimit { get; set; }
    }


四.抽象类Con仕oller定义了如下一系列的Json 方法用于根据指定的数据对象、编码方式以及JsonRequestl3ehavior 来创建相应的JsonResult:

       public abstract class Controller : ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable,  ..........
       {

           protected internal JsonResult Json(object data);
           protected internal JsonResult Json(object data, JsonRequestBehavior behavior);
           protected internal JsonResult Json(object data, string contentType);
           protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding);
           protected internal JsonResult Json(object data, string contentType, JsonRequestBehavior behavior);
           protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior);

       }

五.例子

 

    [HttpPost]

  public class AccountController : Controller

  {

     public JsonResult LoginGet( )
        {

              var result = new {
                                       flag = "ok",
                                       msg = "提供密码错误!"
                                     };

            return Json(result);

     }

  }

试图:

      <script type="text/javascript">

        $(function () {
            $('#btLogin').click(function () {
                //对象集合
               // var models = [];
               // models.push({ UserName: userName, Password: password });

                //Json对象作为参数(名称必须与模型属性名相同)
                var models = {
                    "UserName": userName,
                    "Password": password
                };
               
                //模型绑定
                //var models = new Object();
                //models.UserName = userName;
                //models.Password = password;
                
                $.ajax({
                    url: '/Account/Login',
                    data: JSON.stringify(models),
                    type: 'POST',
                    contentType: 'application/json; charset=utf-8',
                    success: function (data) {
                       if(  data.flag =='ok') {

                         alert(data.msg);

                         }               
                    }, error: function (XMLHttpRequest, textStatus, errorThrown) {
                        $.show_warning('提示', '错误');
                    }
                });

            });
        });

    </script>



     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值