ASP.NET MVC:如何创建一个动作filter来输出JSON?

我在ASP.NET MVC的第二天,也是我第一次在SO上请求代码(是的,快捷方式)。

我正在寻找一种方法来创建一个filter,拦截一个Action的当前输出,而不是输出JSON(我知道其他方法,但这是为了帮助我理解filter)。 我想忽略与该操作相关的任何视图,只需抓取ViewData [“Output”],将其转换为JSON并将其发送出客户端。 空白填补:

TestController.cs:

 [JSON] public ActionResult Index() { ViewData["Output"] = "This is my output"; return View(); } 

JSONFilter.cs:

 public override void OnActionExecuting(ActionExecutingContext filterContext) { /* * 1. How to override the View template and set it to null? * ViewResult { ViewName = "" } does not skip the view (/Test/Index) * * 2. Get existing ViewData, convert to JSON and return with appropriate * custom headers */ } 

更新:社区答案导致更全面地实施JSON / POXfilter 。

我建议你真正想做的是使用Model而不是任意的ViewData元素,并覆盖OnActionExecuted而不是OnActionExecuting 。 这样,您只需在JsonResult执行之前将结果替换为JsonResult然后将其呈现给浏览器。

 public class JSONAttribute : ActionFilterAttribute { ... public override void OnActionExecuted( ActionExecutedContext filterContext) { var result = new JsonResult(); result.Data = ((ViewResult)filterContext.Result).Model; filterContext.Result = result; } ... } [JSON]public ActionResult Index() { ViewData.Model = "This is my output"; return View(); } 

您没有提到仅有条件地返回JSON,因此如果您希望操作每次都返回JSON,为什么不使用:

 public JsonResult Index() { var model = new{ foo = "bar" }; return Json(model); } 

也许这篇文章可以帮助你正确的方式。 以上post也是一种方法