Отрисовать партиал из другой папки (не общей)

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
261
0
168 901
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий

Просто укажите путь к представлению с расширением файла.

Бритва:

@Html.Partial("~/Views/AnotherFolder/Messages.cshtml", ViewData.Model.Successes)

Двигатель ASP.NET:

<% Html.RenderPartial("~/Views/AnotherFolder/Messages.ascx", ViewData.Model.Successes); %>

Если это не ваша проблема, не могли бы вы включить свой код, который использовался для работы с RenderUserControl?

Хотелось бы, чтобы мы могли просто сказать / AnotherFolder / Messages

Simon_Weaver 13.03.2009 06:10

@Simon_Weaver Вы можете этого добиться. Один из способов - изменить ViewEngine и переопределить его метод FindPartialView с помощью чего-то вроде if (partialViewName.Contains"/")partialViewName = "~/Views/"+pa‌​rtialViewName;.

Arnis Lapsa 30.01.2011 20:31

Также работает в движке MVC 3 Razor, но, как и в предыдущем случае, вам потребуется расширение (.cshtml).

Chris 03.03.2012 11:26

Если он находится под другим, вам нужно будет указать путь "~ / Areas / TestArea / Views / Shared / _SomePartial.mobile.cshtml"

sandeep talabathula 14.04.2015 20:53

Как вы справляетесь с различными культурами этого частичного представления (например, ~ / Views / AnotherFolder / Messages.en.cshtml)?

jasdefer 02.08.2017 18:48

VirtualPathProviderViewEngine, на котором основан WebFormsViewEngine, должен поддерживать символы «~» и «/» в начале пути, поэтому приведенные выше примеры должны работать.

Я заметил, что в ваших примерах используется путь «~ / Account / myPartial.ascx», но вы упомянули, что ваш пользовательский элемент управления находится в папке Views / Account. Ты пробовала

<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>

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

Для пользовательского элемента управления с именем myPartial.ascx, расположенного в папке Views / Account, напишите следующее:

<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>

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

~/Views/Shared/parts/UMFview.ascx

поместите ~/Views/ перед кодом

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

Пожалуйста, прочтите вопрос, поскольку пользователь спрашивает о просмотре в другой папке, где находится папка в вашем коде?

Pamma 05.11.2013 02:52

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

В моем случае я использовал MvcMailer (https://github.com/smsohan/MvcMailer) и хотел получить доступ к частичному представлению из другой папки, которой не было в «Shared». Вышеупомянутые решения не сработали, но с использованием относительного пути.

@Html.Partial("../MyViewFolder/Partials/_PartialView", Model.MyObject)

Аналогично @ Html.Partial ("../ Shared / _PartialView") для использования общей папки.

Curtis Yallop 24.07.2013 22:11

Я обнаружил, что это не работает без расширения .cshtml в конце.

Luke 28.10.2014 17:24

Если вы часто используете этот другой путь, вы можете исправить это навсегда, не указывая путь все время. По умолчанию он проверяет наличие частичных представлений в папке «Просмотр» и в общей папке. Но скажите, что вы хотите добавить один.

Добавьте класс в папку Models:

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();
   }
}

Затем в файле Global.asax.cs добавьте следующую строку:

ViewEngines.Engines.Add(new NewViewEngine());

Конечно, я понимаю, что этот вопрос задавали очень давно. Подумал, что добавлю к нему для будущих гуглеров и будущих Бингеров.

Paul 11.03.2015 22:25

- Не будет работать в .Net Core 2.2, так как RazorViewEngine.PartialViewLocationFormats не существует.

Demian Berisford-Maynard 04.06.2019 19:48

Создайте настраиваемый механизм просмотра и получите метод, который возвращает ViewEngineResult В этом примере вы просто перезаписываете _options.ViewLocationFormats и добавляете свою папку в каталог. :

public ViewEngineResult FindView(ActionContext context, string viewName, bool isMainPage)
        {
            var controllerName = context.GetNormalizedRouteValue(CONTROLLER_KEY);
            var areaName = context.GetNormalizedRouteValue(AREA_KEY);

            var checkedLocations = new List<string>();
            foreach (var location in _options.ViewLocationFormats)
            {
                var view = string.Format(location, viewName, controllerName);
                if (File.Exists(view))
                {
                    return ViewEngineResult.Found("Default", new View(view, _ViewRendering));
                }
                checkedLocations.Add(view);
            }

            return ViewEngineResult.NotFound(viewName, checkedLocations);
        }

Пример: https://github.com/AspNetMonsters/pugzor

Для читателей, использующих ASP.NET Core 2.1 или новее и желающих использовать синтаксис Частичный помощник по тегам, попробуйте следующее:

<partial name = "~/Views/Folder/_PartialName.cshtml" />

Тильда (~) не обязательна.

Информация на https://docs.microsoft.com/en-us/aspnet/core/mvc/views/partial?view=aspnetcore-3.1#partial-tag-helper тоже полезна.

Другие вопросы по теме