Отображение вида из другого контроллера в ASP.NET MVC
Можно ли отобразить вид с другого контроллера?
Скажем, например, у меня есть CategoriesController
и Category/NotFound.aspx
Посмотреть. Хотя в CategoriesController
Я могу легко вернуться View("NotFound")
,
Теперь скажи, что у меня есть ProductsController
и действие и вид, чтобы добавить продукт. Тем не менее, это действие требует, чтобы у нас была Категория для добавления Продукта. Например, Products/Add/?catid=10
,
Если я не могу найти категорию на основе catid
Я хочу показать NotFound
вид из контроллера категорий вместо создания CategoryNotFound
просмотр под контроллером продуктов.
Это возможно или я неправильно структурирую вещи? Есть ли хороший способ сделать это?
7 ответов
Да. По умолчанию ASP.NET MVC сначала проверяет \Views\[Controller_Dir]\
, но после этого, если он не находит представление, он проверяет \Views\Shared
,
Общий каталог предназначен для совместного использования представлений на нескольких контроллерах. Просто добавьте ваш вид в подкаталог Shared, и все готово.
Если вы делаете return View("~/Views/Wherever/SomeDir/MyView.aspx")
Вы можете вернуть любой вид, который хотите.
Ты можешь использовать:
return View("../Category/NotFound", model);
Он был протестирован в ASP.NET MVC 3, но также должен работать в ASP.NET MVC 2.
Да, это возможно. Вернуть RedirectToAction()
метод как это:
return RedirectToAction("ActionOrViewName", "ControllerName");
Да, ты можешь. Верните действие как это:
return RedirectToAction("View", "Name of Controller");
Пример:
RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees");
Этот подход вызовет метод GET
Также вы можете передать значения действию следующим образом:
RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees", new {id = id.ToString(), viewtype = "extended" );
Вы также можете вызвать любой контроллер из JavaScript/ jQuery. Скажем, у вас есть контроллер, возвращающий 404, или другой пользовательский элемент управления / страницу. Затем, по какому-либо действию, из вашего клиентского кода вы можете вызвать некоторый адрес, который запустит ваш контроллер и вернуть результат в формате HTML, ваш клиентский код может взять этот возвращенный результат и поместить его туда, куда вы хотите, на свою страницу...
С помощью этого кода вы можете получить любой контроллер:
var controller = DependencyResolver.Current.GetService<ControllerB>();
controller.ControllerContext = new ControllerContext(this.Request.RequestContext,
controller);