赞
踩
自定义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方法来进行处理了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。