2009-03-26 2 views
4

Мой второй день с ASP.NET MVC и мой первый запрос для кода на SO (да, взяв короткое сокращение).ASP.NET MVC: Как создать фильтр действий для вывода JSON?

Я ищу способ создания фильтра, который перехватывает текущий вывод из Action и вместо этого выводит JSON (я знаю alternate approaches, но это поможет мне понять фильтры). Я хочу игнорировать любые представления, связанные с действием, и просто захватить 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 
    */ 
} 

Update: ответы сообщества привели к более полному осуществлению для filter for JSON/POX.

ответ

4

Я бы предположил, что вы действительно хотите использовать модель, а не произвольные элементы ViewData и переопределить OnActionExecuted, а не OnActionExecuting. Таким образом, вы просто заменяете результат своим 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(); 
} 
+0

Спасибо. 1 строка должна быть скорректирована на ((ViewResultBase) filterContext.Result)). ViewData.Model. Тем не менее, действие Index() по-прежнему показывает связанное с ним представление (Views/Test/Index) вместо того, чтобы показывать кадр JSON, хотя filterContext.Result имеет правильное значение. – aleemb

+0

Выполнение этого в OnActionExecuted отменяет представление и достигает того, что я был после. – aleemb

+0

Хммм. Я бы подумал, что замена результата перед тем, как он будет вынесен, будет подходящим временем. Я уточню свой ответ. – tvanfosson

0

возможно это post может помочь вам правильный путь. Выше пост также метод

3

Вы не упомянули только возвращение JSON условно, так что если вы хотите, чтобы действие, чтобы вернуть JSON каждый раз, почему бы не использовать:

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

Атрибут [JSON] используется для включения или отключения JSON на определенных действиях, но это больше упражнение, как я упоминал. В реальной реализации я, вероятно, проверил бы заголовки запросов HTTP для определения типа ответа. – aleemb

 Смежные вопросы

  • Нет связанных вопросов^_^