【问题标题】:Extending JsonResult扩展 JsonResult
【发布时间】:2011-07-08 06:53:14
【问题描述】:

你如何扩展JsonResult?假设我想做一个JsonTransactionResult,因为我想强制我的所有事务返回一个jsonified TransactionResult 对象。 TransactionResult 对象包含错误消息和内容的数据。我是通过继承还是包装 JsonResult 来做到这一点?

【问题讨论】:

    标签: .net asp.net-mvc-3 jsonresult


    【解决方案1】:

    我只需从 JsonResult 继承并返回 TransactionResult 类的实例。

    虽然我从 ActionResult 继承并使用 JSON.NET,但我也有类似的东西,因为使用内置 JsonResult 的 DateTime 存在一些序列化问题。

    /// <summary>
    /// A Newtonsoft.Json based JsonResult for ASP.NET MVC
    /// </summary>
    public class JsonNetResult : ActionResult
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="JsonNetResult"/> class.
        /// </summary>
        public JsonNetResult()
        {
            this.SerializerSettings = new JsonSerializerSettings();
        }
    
        /// <summary>
        /// Gets or sets the content encoding.
        /// </summary>
        /// <value>The content encoding.</value>
        public Encoding ContentEncoding { get; set; }
    
        /// <summary>
        /// Gets or sets the type of the content.
        /// </summary>
        /// <value>The type of the content.</value>
        public string ContentType { get; set; }
    
        /// <summary>
        /// Gets or sets the data.
        /// </summary>
        /// <value>The data object.</value>
        public object Data { get; set; }
    
        /// <summary>
        /// Gets or sets the serializer settings.
        /// </summary>
        /// <value>The serializer settings.</value>
        public JsonSerializerSettings SerializerSettings { get; set; }
    
        /// <summary>
        /// Gets or sets the formatting.
        /// </summary>
        /// <value>The formatting.</value>
        public Formatting Formatting { get; set; }
    
        /// <summary>
        /// Enables processing of the result of an action method by a custom type that inherits from the <see cref="T:System.Web.Mvc.ActionResult"/> class.
        /// </summary>
        /// <param name="context">The context in which the result is executed. The context information includes the controller, HTTP content, request context, and route data.</param>
        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
    
            HttpResponseBase response = context.HttpContext.Response;
    
            response.ContentType = !String.IsNullOrWhiteSpace(this.ContentType) ? this.ContentType : "application/json";
    
            if (this.ContentEncoding != null)
            {
                response.ContentEncoding = this.ContentEncoding;
            }
    
            if (this.Data != null)
            {
                JsonTextWriter writer = new JsonTextWriter(response.Output) { Formatting = this.Formatting };
    
                JsonSerializer serializer = JsonSerializer.Create(this.SerializerSettings);
                serializer.Serialize(writer, this.Data);
    
                writer.Flush();
            }
        }
    }
    

    然后我从那个类继承,用结果包装一个成功属性:

    /// <summary>
    /// Derives from <see cref="JsonNetResult"/>. This action result can be used to wrap an AJAX callback result with a status code and a description, along with the actual data.
    /// </summary>
    public class CallbackJsonResult : JsonNetResult
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="CallbackJsonResult"/> class.
        /// </summary>
        /// <param name="statusCode">The status code.</param>
        public CallbackJsonResult(HttpStatusCode statusCode)
        {
            this.Initialize(statusCode, null, null);
        }
    
        /// <summary>
        /// Initializes a new instance of the <see cref="CallbackJsonResult"/> class.
        /// </summary>
        /// <param name="statusCode">The status code.</param>
        /// <param name="description">The description.</param>
        public CallbackJsonResult(HttpStatusCode statusCode, string description)
        {
            this.Initialize(statusCode, description, null);
        }
    
        /// <summary>
        /// Initializes a new instance of the <see cref="CallbackJsonResult"/> class.
        /// </summary>
        /// <param name="statusCode">The status code.</param>
        /// <param name="data">The callback result data.</param>
        public CallbackJsonResult(HttpStatusCode statusCode, object data)
        {
            this.Initialize(statusCode, null, data);
        }
    
        /// <summary>
        /// Initializes a new instance of the <see cref="CallbackJsonResult"/> class.
        /// </summary>
        /// <param name="statusCode">The status code.</param>
        /// <param name="description">The description.</param>
        /// <param name="data">The callback result data.</param>
        public CallbackJsonResult(HttpStatusCode statusCode, string description, object data)
        {
            this.Initialize(statusCode, description, data);
        }
    
        /// <summary>
        /// Initializes this instance.
        /// </summary>
        /// <param name="statusCode">The status code.</param>
        /// <param name="description">The description.</param>
        /// <param name="data">The callback result data.</param>
        private void Initialize(HttpStatusCode statusCode, string description, object data)
        {
            Data = new { Success = statusCode == HttpStatusCode.OK, Status = (int)statusCode, Description = description, Data = data };
        }
    }
    

    【讨论】:

    猜你喜欢
    • 2019-02-25
    • 2020-09-10
    • 2014-09-23
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多