Вернуть JsonResult, используя ActionFilter для ActionResult в контроллере - PullRequest
8 голосов
/ 02 ноября 2009

Я хочу вернуть Модель (данные) контроллера в разных форматах (JavaScript / XML / JSON / HTML), используя ActionFilter's. Вот где я сейчас нахожусь:

Фильтр действий:

public class ResultFormatAttribute : ActionFilterAttribute, IResultFilter
{
    void IResultFilter.OnResultExecuting(ResultExecutingContext context)
    {
        var viewResult = context.Result as ViewResult;

        if (viewResult == null) return;

        context.Result = new JsonResult { Data = viewResult.ViewData.Model };
    }
}

И это реализация:

[ResultFormat]
public ActionResult Entries(String format)
{
    var dc = new Models.WeblogDataContext();

    var entries = dc.WeblogEntries.Select(e => e);

    return View(entries);
}

Метод OnResultExecuting вызывается, но я не получаю Модель (данные), возвращенную и отформатированную как объект JSON. Мой контроллер просто отображает вид.


Обновление: Я следую предложению ответа Дарина Димитрова на этот вопрос .

Ответы [ 3 ]

12 голосов
/ 02 ноября 2009

Это было то, что я искал:

public class ResultFormatAttribute : ActionFilterAttribute, IActionFilter
{
    void IActionFilter.OnActionExecuted(ActionExecutedContext context)
    {
        context.Result = new JsonResult
        {
            Data = ((ViewResult)context.Result).ViewData.Model
        };
    }
}
1 голос
/ 02 ноября 2009

Вы пытались реализовать код фильтра в методе OnActionExecuted вместо OnResultExecuting? Возможно, что к тому времени, когда последний запущен, уже слишком поздно менять результат (семантика: «Хорошо, у нас есть результат в руках, и этот хук срабатывает прямо перед выполнением этого результата прямо здесь»), У меня сейчас нет времени, чтобы проверить исходный код MVC.

0 голосов
/ 02 ноября 2009

Вы пробовали:

return Json(entries);

с типом возврата JsonResult для действия контроллера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...