У мене є XXX.cshtml
файл у Views\ABC
папці. Його контролером єABC
У моєму DEF
контролері також є метод дії, який повертає aPartialview("XXX" , xyzmodel)
Я отримую помилку "подання не знайдено".
Як викликати цей погляд з іншого контролера
У мене є XXX.cshtml
файл у Views\ABC
папці. Його контролером єABC
У моєму DEF
контролері також є метод дії, який повертає aPartialview("XXX" , xyzmodel)
Я отримую помилку "подання не знайдено".
Як викликати цей погляд з іншого контролера
Відповіді:
Зазвичай представлення належать до певного відповідного контролера, який підтримує його вимоги до даних, або подання належить до 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("XXX", "ABC", new {id = model.xyzId })
Це виконає ABC.XXX
дію і відобразить результат на місці. Це дозволяє поданням та контролерам залишатися окремо автономними (тобто багаторазовими).
Я щойно потрапив у ситуацію, коли я не міг використовувати @ 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);
}
}
Елемент керування шукає подання в такому порядку:
Оскільки у вас немає xxx.cshtml
в цих місцях, він повертає помилку "подання не знайдено".
Рішення: Ви можете використати повний шлях вашого перегляду:
Подібно до
PartialView("~/views/ABC/XXX.cshtml", zyxmodel);
"best answer tick' and up-votes
просто ділитися .... Будь-яким чином спасибі за вашу думку. :)
Просто ви можете використовувати:
PartialView("../ABC/XXX")