Как вернуть частичный вид другого контроллера контроллером?
у меня есть на ViewsABC
папка. Его контроллер ABC
у меня также есть метод действия в моем DEF
контроллер, который возвращает a Partialview("XXX" , xyzmodel)
я получаю сообщение об ошибке "вид не найден".
как это назвать view от другого контроллера
3 ответа:
обычно представления принадлежат с определенным соответствующий контроллер который поддерживает свои требования к данным, или представление принадлежит в
Views/Shared
папка, если совместно используется между контроллерами (отсюда и название)."ответить" (но не рекомендуется - см. ниже):
вы можете см. views / partial views от другого контроллера, указав полный путь (включая расширение), например:
return PartialView("~/views/ABC/XXX.cshtml", zyxmodel);
или относительный путь (без расширение), на основе ответа от
@Max Toro
return PartialView("../ABC/XXX", zyxmodel);
НО ЭТО ВСЕ РАВНО НЕ ОЧЕНЬ ХОРОШАЯ ИДЕЯ
*Примечание: это только два синтаксиса, которые работают. не
ABC\XXX
илиABC/XXX
или любой другой вариант, поскольку это все относительные пути и не находят совпадения.Лучшие Альтернативы:
можно использовать
Html.Renderpartial
на ваш взгляд вместо этого, но он также требует расширения:Html.RenderPartial("~/Views/ControllerName/ViewName.cshtml", modeldata);
использовать
@Html.Partial
для встроенного синтаксиса бритвы:@Html.Partial("~/Views/ControllerName/ViewName.cshtml", modeldata)
вы можете использовать
../controller/view
синтаксис без расширения (опять же кредит на @Max Toro):@Html.Partial("../ControllerName/ViewName", modeldata)
Примечание: Видимо
RenderPartial
немного быстрее, чем частичный, но это не важно.если вы хотите фактически вызвать другой контроллер, используйте:
@Html.Action("action", "controller", parameters)
рекомендуемое решение: @Html.Действие
мое личное предпочтение-использовать
@Html.Action
как это позволяет каждому контроллеру управляйте своими собственными представлениями, а не перекрестными ссылками на представления от других контроллеров (что приводит к большому беспорядку спагетти).обычно вы передаете только необходимые значения ключа (как и любой другой вид), например, для вашего примера:
@Html.Action("XXX", "ABC", new {id = model.xyzId })
это будет выполнять
ABC.XXX
действие и визуализация результата на месте. Это позволяет представлениям и контроллерам оставаться отдельно автономными (т. е. многоразовыми).Обновление Sep 2014:
у меня есть просто попал в ситуацию, когда я не мог использовать @Html.Действие, но необходимо создать путь представления на основе
action
иcontroller
имена. С этой целью я добавил Этот простойView
метод расширения, чтобыUrlHelper
так что вы можете сказать returnPartialView(Url.View("actionName", "controllerName"), modelData)
:public static class UrlHelperExtension { /// <summary> /// Return a view path based on an action name and controller name /// </summary> /// <param name="url">Context for extension method</param> /// <param name="action">Action name</param> /// <param name="controller">Controller name</param> /// <returns>A string in the form "~/views/{controller}/{action}.cshtml</returns> public static string View(this UrlHelper url, string action, string controller) { return string.Format("~/Views/{1}/{0}.cshtml", action, controller); } }
элемент управления ищет представление в следующем порядке:
- первый в общей папке
- затем в папке, соответствующей текущему контроллеру (в вашем случае это Views/DEF)
как у вас нет
xxx.cshtml
в этих местах он возвращает ошибку "вид не найден".решение: вы можете использовать полный путь ваш вид:
Как
PartialView("~/views/ABC/XXX.cshtml", zyxmodel);