Отображение представления из другого контроллера в ASP.NET MVC

202

Можно ли отобразить представление с другого контроллера?

Скажем, например, у меня есть представление CategoriesController и Category/NotFound.aspx. Пока в CategoriesController, я могу легко вернуть View("NotFound").

Теперь скажите, что у меня есть ProductsController, а действие и представление - для добавления продукта. Однако для этого действия требуется, чтобы у нас была категория для добавления Продукта в. Например, Products/Add/?catid=10.

Если я не могу найти категорию на основе catid, я хочу показать представление NotFound из контроллера Категории, а не создать представление CategoryNotFound в контроллере Products.

Возможно ли это, или я неправильно структурирую вещи? Есть ли хороший способ сделать это?

Теги:
asp.net-mvc
views
controllers

6 ответов

229
Лучший ответ

Да. По умолчанию ASP.NET MVC проверяет сначала в \Views\[Controller_Dir]\, но после этого, если он не находит представление, он проверяет \Views\Shared.

Общий каталог предназначен для совместного использования представлений между несколькими контроллерами. Просто добавьте свой View в подкаталог Shared, и вам будет хорошо идти.

Если вы делаете return View("~/Views/Wherever/SomeDir/MyView.aspx"), вы можете вернуть любой вид, который вам нужен.

  • 0
    Спасибо, это похоже на решение, которое я должен использовать. Я все еще задаюсь вопросом, возможно ли отобразить View с другого контроллера. Я предполагаю, что это нарушает какое-то правило в MVC?
  • 1
    В описанной выше ситуации, да, вы должны использовать общую папку.
Показать ещё 3 комментария
151

Вы можете использовать:

return View("../Category/NotFound", model);

Он был протестирован в ASP.NET MVC 3, но также должен работать в ASP.NET MVC 2.

  • 3
    Работает в MVC 2 и оказался самым чистым решением для необычной ситуации, с которой я сталкиваюсь.
  • 3
    это тоже работает в mvc1
Показать ещё 9 комментариев
31

Вы пробовали RedirectToAction?

  • 1
    Я бы сказал, что это MVC для тех, кому не нужен вид в общих папках. Обратите внимание, что для всех других решений (например, с использованием прямых путей) любому, кто пытается рефакторизовать представления, не придется принимать во внимание что он также используется в другом контроллере, что приводит к непредсказуемому поведению
  • 3
    как насчет без перенаправления?
Показать ещё 7 комментариев
26

Да, это возможно. Верните метод RedirectToAction() следующим образом:

return RedirectToAction("ActionOrViewName", "ControllerName");
  • 1
    Я полагаю, что это должно идти как RedirectToAction ("ActionOrView", "Controller", null), в противном случае вторым параметром является routeValues
  • 0
    Эти ответы могут иметь гораздо больше голосов !!
Показать ещё 1 комментарий
12

Да, вы можете. Верните действие, подобное этому:

return RedirectToAction("View", "Name of Controller");

Пример:

RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees");

Этот подход вызовет метод GET

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

RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees", new {id = id.ToString(), viewtype = "extended" );
  • 0
    Как бы я отправить объект с этим подходом?
  • 0
    Посмотрите @Djeroen
Показать ещё 1 комментарий
4

Вы также можете вызвать любого контроллера из JavaScript/jQuery. Скажем, у вас есть контроллер, возвращающий 404 или какой-либо другой пользовательский контроль/страницу. Затем, при некоторых действиях, из вашего клиентского кода вы можете вызвать какой-то адрес, который запустит ваш контроллер и вернет результат в HTML формате ваш клиентский код может принять этот возвращенный результат и поместить его туда, где вы хотите, на свою страницу...

  • 0
    Я не знал этого. Похоже, это то, что я мог бы использовать в будущем. Да, мвк рулит :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню