Ответ 1
Обычно представления относятся к определенному согласующему контроллеру, который поддерживает свои требования к данным, или представление принадлежит в папке Views/Shared
, если оно разделено между контроллерами (отсюда и название).
"Ответ" (но не рекомендуется - см. ниже):
Вы можете ссылаться на представления/частичные представления от другого контроллера, указав полный путь (включая расширение), например:
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
для встроенного синтаксиса Razor:
@Html.Partial("~/Views/ControllerName/ViewName.cshtml", modeldata)
Синтаксис ../controller/view
можно использовать без расширения (опять-таки кредит @Max Toro):
@Html.Partial("../ControllerName/ViewName", modeldata)
Примечание. По-видимому, RenderPartial
немного быстрее, чем Partial, но это не важно.
Если вы хотите на самом деле вызвать другого контроллера, используйте:
@Html.Action("action", "controller", parameters)
Рекомендуемое решение: @Html.Action
Мое личное предпочтение - использовать @Html.Action
, поскольку он позволяет каждому контроллеру управлять своими собственными представлениями, а не перекрестно ссылаться на представления от других контроллеров (что приводит к большому спагетти-подобному беспорядку).
Обычно вы передавали только требуемые значения ключа (например, любое другое представление), например. для вашего примера:
@Html.Action("XXX", "ABC", new {id = model.xyzId })
Это выполнит действие ABC.XXX
и отобразит результат на месте. Это позволяет представлениям и контроллерам оставаться отдельно автономными (то есть повторно использовать).
Обновление сентябрь 2014:
Я только что попал в ситуацию, когда я не мог использовать @Html.Action, но мне нужно было создать путь представления на основе имен action
и controller
. С этой целью я добавил этот простой метод расширения View
в UrlHelper
, чтобы вы могли сказать return PartialView(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);
}
}