Як повернути частковий вигляд іншого контролера контролером?


80

У мене є XXX.cshtmlфайл у Views\ABCпапці. Його контролером єABC

У моєму DEFконтролері також є метод дії, який повертає aPartialview("XXX" , xyzmodel)

Я отримую помилку "подання не знайдено".

Як викликати цей погляд з іншого контролера

Відповіді:


158

Зазвичай представлення належать до певного відповідного контролера, який підтримує його вимоги до даних, або подання належить до 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це трохи швидше, ніж Часткове, але це не важливо.

Якщо ви хочете фактично викликати інший контролер, використовуйте:

@Html.Action("action", "controller", parameters)

Рекомендоване рішення: @ Html.Action

Мої особисті переваги полягають у використанні, @Html.Actionоскільки це дозволяє кожному контролеру керувати власними поданнями, а не перехресними посиланнями на подання інших контролерів (що призводить до великого безладу, схожого на спагетті).

Зазвичай ви передаєте лише необхідні значення ключів (як і будь-який інший вигляд), наприклад, для вашого прикладу:

@Html.Action("XXX", "ABC", new {id = model.xyzId })

Це виконає ABC.XXXдію і відобразить результат на місці. Це дозволяє поданням та контролерам залишатися окремо автономними (тобто багаторазовими).

Оновлення вересня 2014 року:

Я щойно потрапив у ситуацію, коли я не міг використовувати @ Html.Action, але мені потрібно було створити шлях перегляду на основі імен actionта a 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);
    }
}

4
@ Html.Action - це шлях
Арман,

Ваш рекомендований підхід змусив би мене зателефонувати до служб із зору, щоб отримати модель, яку мені частково потрібно. Чого я не хочу уникати.
Раймонда

11

Елемент керування шукає подання в такому порядку:

  • Перший у спільній папці
  • Потім у папці, що відповідає поточному контролеру (у вашому випадку це Views / DEF)

Оскільки у вас немає xxx.cshtmlв цих місцях, він повертає помилку "подання не знайдено".

Рішення: Ви можете використати повний шлях вашого перегляду:

Подібно до

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

@TrueBlueAussie дякую за виправлення. Ви добре пояснили. Йдеться не про заробіток, "best answer tick' and up-votesпросто ділитися .... Будь-яким чином спасибі за вашу думку. :)
Арун Чандран C

Справді. Ось чому я також редагував ваш запис, щоб покращити його.
Пропало кодування

6

Просто ви можете використовувати:

PartialView("../ABC/XXX")

Спочатку я скептично ставився до цього синтаксису, але він працює чудово, в тому числі із дій контролера за замовчуванням. Чи є у вас посилання на це?
Пройшло кодування
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.