Search code examples
c#asp.net-mvcjsonaction-filter

ASP.NET MVC: How to create an action filter to output JSON?


My second day with ASP.NET MVC and my first request for code on SO (yep, taking a short cut).

I am looking for a way to create a filter that intercepts the current output from an Action and instead outputs JSON (I know of alternate approaches but this is to help me understand filters). I want to ignore any views associated with the action and just grab the ViewData["Output"], convert it to JSON and send it out the client. Blanks to fill:

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
    */
}

Update: Community answers led to a fuller implementation for a filter for JSON/POX.


Solution

  • I would suggest that what you really want to do is use the Model rather than arbitrary ViewData elements and override OnActionExecuted rather than OnActionExecuting. That way you simply replace the result with your JsonResult before it gets executed and thus rendered to the browser.

    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();
    }