Рендеринг частичный из другой папки (не общий)
Как я могу иметь представление рендеринга частичный (пользовательский элемент управления) из другой папки? С preview 3 я использовал для вызова RenderUserControl с полным путем, но с обновлением до preview 5 это больше невозможно. Вместо этого мы получили метод RenderPartial, но он не предлагает мне функциональность, я ищу.
8 ответов:
просто укажите путь к представлению с расширением файла.
бритвы:
@Html.Partial("~/Views/AnotherFolder/Messages.cshtml", ViewData.Model.Successes)
ASP.NET двигатель:
<% Html.RenderPartial("~/Views/AnotherFolder/Messages.ascx", ViewData.Model.Successes); %>
Если это не ваша проблема, не могли бы вы включить свой код, который используется для работы с RenderUserControl?
в моем случае я использовал MvcMailer (https://github.com/smsohan/MvcMailer) и хотел получить доступ к частичному виду из другой папки, которая не была в "Shared."Вышеуказанные решения не сработали, но использование относительного пути сделало.
@Html.Partial("../MyViewFolder/Partials/_PartialView", Model.MyObject)
Если вы используете этот другой путь много времени вы можете исправить это постоянно без необходимости указывать путь все время. По умолчанию он проверяет наличие частичных представлений в папке View и в общей папке. Но скажите, что вы хотите добавить один.
добавить класс в папку модели:
public class NewViewEngine : RazorViewEngine { private static readonly string[] NEW_PARTIAL_VIEW_FORMATS = new[] { "~/Views/Foo/{0}.cshtml", "~/Views/Shared/Bar/{0}.cshtml" }; public NewViewEngine() { // Keep existing locations in sync base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NEW_PARTIAL_VIEW_FORMATS).ToArray(); } }
тогда в вашем глобальном.асакс.cs файл, добавьте следующую строку:
ViewEngines.Engines.Add(new NewViewEngine());
для пользовательского элемента управления с именем myPartial.ascx, расположенный в папке Views/Account, напишите так:
<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>
Я создал обходной путь, который, кажется, работает довольно хорошо. Я нашел необходимость переключиться на контекст другого контроллера для поиска имени действия, просмотра поиска и т. д. Для реализации этого, я создал новый метод расширения для
HtmlHelper
:public static IDisposable ControllerContextRegion( this HtmlHelper html, string controllerName) { return new ControllerContextRegion(html.ViewContext.RouteData, controllerName); }
ControllerContextRegion
определено как:internal class ControllerContextRegion : IDisposable { private readonly RouteData routeData; private readonly string previousControllerName; public ControllerContextRegion(RouteData routeData, string controllerName) { this.routeData = routeData; this.previousControllerName = routeData.GetRequiredString("controller"); this.SetControllerName(controllerName); } public void Dispose() { this.SetControllerName(this.previousControllerName); } private void SetControllerName(string controllerName) { this.routeData.Values["controller"] = controllerName; } }
это используется в представлении следующим образом:
@using (Html.ControllerContextRegion("Foo")) { // Html.Action, Html.Partial, etc. now looks things up as though // FooController was our controller. }
могут быть нежелательные побочные эффекты для этого, если ваш код требует
controller
маршрут компонент не меняется, но в нашем коде до сих пор, кажется, нет никаких негативов к этому подходу.
VirtualPathProviderViewEngine, на котором основан WebFormsViewEngine, должен поддерживать символы "~" и "/" в передней части пути, поэтому ваши примеры выше должны работать.
Я заметил, что ваши примеры используют путь " ~ / Account / myPartial.ascx", но вы упомянули, что ваш пользовательский элемент управления находится в папке Views/Account. Вы пробовали
<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>
или это просто опечатка в вашем вопросе?