自定義ActionResult實現NewJsonResult

MVC自帶的JsonResult我們想替換成使用Newtonsoft.Json的類庫來實現,我們可以自定義一個來實現。

我們通過繼承JsonResult來實現

	public class NewJsonResult:JsonResult {
		public override void ExecuteResult(ControllerContext context) {
			if (context == null) {
				throw new ArgumentException("序列化內容不能爲null");
			}
			if (context.HttpContext == null || context.HttpContext.Response == null) {
				return;
			}
			if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Compare(context.HttpContext.Request.HttpMethod, "Get", true)==0) {
				throw new InvalidOperationException();
			}
			context.HttpContext.Response.ContentType = string.IsNullOrEmpty(ContentType) ? "application/json" : ContentType;
			context.HttpContext.Response.ContentEncoding = ContentEncoding == null ? System.Text.Encoding.UTF8 : ContentEncoding;
			if (Data != null) {
				context.HttpContext.Response.Write(JsonConvert.SerializeObject(Data));
			}

		}
	}

這樣就實現了NewJsonResult,但是我們在Controller中調用時想仍舊像原來那樣返回一個Json()的方法,那就可以通過過濾器來實現,MVC中的ActionFilter可以實現此方法,當方法執行完後我們可以在OnActionExecuted中將實現方法改爲通過我們的NewJsonResult來實現。

	public class MyJsonAttribute:ActionFilterAttribute {

		public override void OnActionExecuted(ActionExecutedContext filterContext) {
			//base.OnActionExecuted(filterContext);
			if (filterContext.Result is JsonResult && !(filterContext.Result is NewJsonResult)) {
				JsonResult jResult = (JsonResult)filterContext.Result;
				NewJsonResult result = new NewJsonResult() { Data = jResult.Data, JsonRequestBehavior = jResult.JsonRequestBehavior, ContentEncoding = jResult.ContentEncoding, ContentType = jResult.ContentType };
				filterContext.Result = result;
			}
		}
	}

還需在過濾器配置文件中加上filters.Add(new MyJsonAttribute());

這樣當執行完後過濾器判斷是JsonResult就通過NewJsonResult來實現此方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章