ASP.NET MVC: как создать фильтр действий для вывода JSON? - PullRequest
4 голосов
/ 26 марта 2009

Мой второй день с ASP.NET MVC и мой первый запрос на код для SO (да, кратчайший путь).

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

Ответы [ 3 ]

4 голосов
/ 26 марта 2009

Я хотел бы предложить, что вы действительно хотите использовать модель вместо произвольных 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();
}
3 голосов
/ 26 марта 2009

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

public JsonResult Index()
{
    var model = new{ foo = "bar" };
    return Json(model);
}
0 голосов
/ 26 марта 2009

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

...