Как вернуть частичный вид другого контроллера контроллером?
у меня есть  на ViewsABC папка. Его контроллер ABC
у меня также есть метод действия в моем DEF контроллер, который возвращает a Partialview("XXX" , xyzmodel)
я получаю сообщение об ошибке "вид не найден".
как это назвать view от другого контроллера
3 ответа:
обычно представления принадлежат с определенным соответствующий контроллер который поддерживает свои требования к данным, или представление принадлежит в
Views/Sharedпапка, если совместно используется между контроллерами (отсюда и название)."ответить" (но не рекомендуется - см. ниже):
вы можете см. views / partial views от другого контроллера, указав полный путь (включая расширение), например:
return PartialView("~/views/ABC/XXX.cshtml", zyxmodel);или относительный путь (без расширение), на основе ответа от
@Max Tororeturn 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);