Рендеринг частичный из другой папки (не общий)


Как я могу иметь представление рендеринга частичный (пользовательский элемент управления) из другой папки? С preview 3 я использовал для вызова RenderUserControl с полным путем, но с обновлением до preview 5 это больше невозможно. Вместо этого мы получили метод RenderPartial, но он не предлагает мне функциональность, я ищу.

8 218

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");%>

или это просто опечатка в вашем вопросе?

вы должны попробовать это

~/Views/Shared/parts/UMFview.ascx

место ~/Views/ прежде чем ваш код

попробуйте использовать RenderAction("myPartial","Account");