.Net Core下自定义JsonResult

自定义JsonResult其实就是利用了过滤器来实现的,过滤器的概念其实跟.net framework中差不多,不明白的可以去补习下相关知识点。

为什么要自定义JsonResult呢,因为mvc 要把json序列化都通过Newtonsoft来实现,之前在.net framework也是这么来操作的,因为.net自带的序列化方法对日期格式显示并不是我们要的格式,当然也可以用其他方法来实现如自定义日期格式

这边要特别说明下,之前在.net framework中如果HttpGet返回JsonResult时需要加上JsonRequestBehavior.AllowGet这么一句话,而在.net core下没有此方法了,那我们要返回JsonResult怎么办呢,就直接加上特性[HttpPost]行了。

这也正是自定义JsonResult时跟之前.net framework时不同的地方

方法,自定义NewJsonResult继承JsonResult 然后重写ExecuteResult方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNetCore.Http;
//using System.Web.Mvc;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using System.Text;

namespace MyMis.MvcHelper {
	public class NewJsonResult:JsonResult {
        public NewJsonResult(object value)
            :base(value){

        }
        public override void ExecuteResult(ActionContext context) {
			if (context == null) {
				throw new ArgumentException("序列化内容不能为null");
			}
			if (context.HttpContext == null || context.HttpContext.Response == null) {
				return;
			}
			context.HttpContext.Response.ContentType = string.IsNullOrEmpty(ContentType) ? "application/json" : ContentType;
			//context.HttpContext.Response.ContentEncoding = ContentEncoding == null ? System.Text.Encoding.UTF8 : ContentEncoding;
			if (Value != null) {
				context.HttpContext.Response.WriteAsync(JsonConvert.SerializeObject(Value));
			}

		}
	}
}

将此方法加入自定义的ActionFilter中,自定义MyJsonActionFilter对OnActionExecuted进行自定义下调用上面的NewJsonResult来对JsonResult进行处理进行输出

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using MyMis.MvcHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace MyMis.Web.Filter
{
    public class MyJsonActionFilter : Attribute, IActionFilter {
        public void OnActionExecuted(ActionExecutedContext context) {
            //Console.WriteLine("结束执行此操作");
            if (context.Result is JsonResult && !(context.Result is NewJsonResult)) {
                JsonResult jResult = (JsonResult)context.Result;
                NewJsonResult result = new NewJsonResult(jResult.Value) { Value = jResult.Value, SerializerSettings= jResult.SerializerSettings, ContentType = jResult.ContentType };
                context.Result = result;
            }
        }

        public void OnActionExecuting(ActionExecutingContext context) {
            Console.WriteLine("开始执行此操作");
        }
    }
}

最后我们要全局注册下就直接在Startup文件中的ConfigureServices方法里进行注册下

            services.AddMvc(m=> {
                //注册到集合的第一个
                m.ModelBinderProviders.Insert(0, new ModelBinderProvider());
                //注册过滤器
                m.Filters.Add(typeof(MyJsonActionFilter));
                m.Filters.Add(typeof(CustomerExceptionFilter));
            });

这样,我们在Action中调用Json方法时就会用自定义的NewJsonResult方法来进行处理了

你可能感兴趣的:(.Net,Core,MVC,JsonResult)