Подтвердить что ты не робот

Как вернуть частичный вид другого контроллера контроллером?

У меня есть файл XXX.cshtml в папке Views\ABC. Его контроллер ABC

У меня также есть метод действий в моем контроллере DEF, который возвращает Partialview("XXX" , xyzmodel)

Я получаю сообщение "не найден".

Как вызвать этот вид с другого контроллера

4b9b3361

Ответ 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);
    }
}

Ответ 2

Элемент управления выполняет поиск в следующем порядке:

  • Сначала в общей папке
  • Затем в папке, соответствующей текущему контроллеру (в вашем случае это Views/DEF)

Поскольку у вас нет xxx.cshtml в этих местах, он возвращает ошибку "не найден".

Решение. Вы можете использовать полный путь к вашему представлению:

Как

 PartialView("~/views/ABC/XXX.cshtml", zyxmodel);

Ответ 3

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

PartialView("../ABC/XXX")