Проблемы с маршрутизацией MVC3 — Как повторно использовать представление для всех методов контроллера?

#asp.net-mvc-3 #asp.net-mvc-routing

#asp.net-mvc-3 #asp.net-mvc-routing

Вопрос:

Я пытаюсь реализовать общий контроллер в MVC3 для возврата различных каналов JSON, например —

 public class AjaxController : Controller
{
    public ActionResult Feed1()
    {
        ViewBag.Json = LogicFacade.GetFeed1Json();
        return View();
    }

    public ActionResult Feed2()
    {
        ViewBag.Json = LogicFacade.GetFeed2Json();
        return View();
    }
}
  

В этом классе более 30 методов, проблема в том, что это требует реализации ИДЕНТИЧНОГО представления для каждого из методов контроллера (sigh), который записывает ViewBag.Json.

Я предполагаю, что это проблема с маршрутизацией, но я борюсь с этим. Следующее не сработало —

  • Попытался установить ViewBag.Затем Json с использованием RedirectToAction(), но, похоже, это сбрасывает ViewBag.Json.
  • Обратите внимание, что JsonResult не подходит для моих нужд, я использую другой сериализатор JSON.

Итак, цель здесь состоит в том, чтобы сохранить один файл представления, но сохранить этот класс с отдельными методами, которые вызываются маршрутизацией, а не дерьмовой реализацией инструкции switch.

Приветствуется любая помощь.

Ответ №1:

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

 return View("SharedJsonView");
  

Другим, возможно лучшим, решением было бы создать свой собственный результат — возможно, на основе JsonResult, возможно, непосредственно из ActionResult — который создает нужный вам ответ JSON. Посмотрите на исходный код для JsonResult на http://www.codeplex.com/aspnet за идеи о том, как это сделать.

Комментарии:

1. Черт возьми, это смущающе просто. Спасибо (нужно подождать 5 минут, чтобы принять ответ)

2. @Chris — если вы пойдете по пути с именем представления, вместо того, чтобы повторять его везде, подумайте о создании частного метода на вашем контроллере, который возвращает именованное представление, а затем просто вызовите его. public ActionResult JsonView() { return View("SharedJsonView"); } и return JsonView();