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


у меня есть на ViewsABC папка. Его контроллер ABC

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

я получаю сообщение об ошибке "вид не найден".

как это назвать view от другого контроллера

3 59

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 так что вы можете сказать 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);
    }
}

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

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

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

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

Как

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

просто вы могли бы использовать:

PartialView("../ABC/XXX")