다음을 통해 공유


ASP.NET MVC Internals

Returning Json Results from Mvc Controllers without JsonResult
Some of the developers may not like returning JsonResult, because it may hide the actual data type we intend to return. They may like to return an object which should be automatically converted to JSON by the controller. The default ASP.NET controller will not do this. We have a work around to fix this.  

Action invocation in ASP.NET MVC controller is accomplished by ActionInvoker. IActionInvoker is the base interface used by ASP.NET MVC controller for Action invocation. System.Web.Mvc.Async.AsyncControllerActionInvoker  is one of the default action invoker for ASP.NET MVC. We can change the default Action Invoker of a Controller by changing the ActionInvoker property of a controller. Before that we may have to created our own Action invoker for converted object to JsonResult.

public class  JsonControllerActionInvoker : AsyncControllerActionInvoker {
    protected override  ActionResult CreateActionResult(
        ControllerContext controllerContext,
        ActionDescriptor actionDescriptor,
        object actionReturnValue) {
 
       return actionReturnValue == null
            ? new  EmptyResult()
            : (actionReturnValue as  ActionResult)
            ?? new  JsonResult() { Data = actionReturnValue, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
    }
}

Then we can change the controller’s Action invoker in the controller’s constructor, with the following code.

this.ActionInvoker = new  JsonControllerActionInvoker();

Instead of adding this code to all our controller class we can have a base controller for this.

public class  JsonController : Controller {
    public JsonController() {
        this.ActionInvoker = new  JsonControllerActionInvoker();
    }
}

See Also