Как я могу просмотреть представление частичного (пользовательского элемента управления) из другой папки? С предварительным просмотром 3 я использовал для вызова RenderUserControl полный путь, но с обновлением до предварительного просмотра 5 это невозможно. Вместо этого мы получили метод RenderPartial, но он не предлагает мне функциональность, которую я ищу.
Отказывать частичную копию из другой папки (не общая)
Ответ 1
Просто укажите путь к представлению с расширением файла.
Бритва:
@Html.Partial("~/Views/AnotherFolder/Messages.cshtml", ViewData.Model.Successes)
Двигатель ASP.NET:
<% Html.RenderPartial("~/Views/AnotherFolder/Messages.ascx", ViewData.Model.Successes); %>
Если это не ваша проблема, не могли бы вы включить свой код, который использовался для работы с RenderUserControl?
Ответ 2
Если вы используете этот другой путь много времени, вы можете исправить это навсегда, не указывая путь все время. По умолчанию он проверяет частичные представления в папке "Просмотр" и в общей папке. Но скажите, что вы хотите добавить его.
Добавьте класс в папку "Модели":
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());
Ответ 3
В моем случае я использовал MvcMailer (https://github.com/smsohan/MvcMailer) и хотел получить доступ к частичному представлению из другой папки, которой не было в "Shared". Вышеупомянутые решения не работали, но с использованием относительного пути.
@Html.Partial("../MyViewFolder/Partials/_PartialView", Model.MyObject)
Ответ 4
Для элемента управления пользователя с именем myPartial.ascx, расположенного в папке Views/Account, пишите так:
<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>
Ответ 5
Я создал обходной путь, который, похоже, работает очень хорошо. Я нашел необходимость переключиться на контекст другого контроллера для поиска имени действия, просмотра вида и т.д. Чтобы реализовать это, я создал новый метод расширения для 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 не изменялся, но в нашем коде до сих пор не было никаких негативов этому подходу.
Ответ 6
VirtualPathProviderViewEngine, на котором основан WebFormsViewEngine, должен поддерживать символы "~" и "/" в начале пути, чтобы ваши примеры выше работали.
Я заметил, что ваши примеры используют путь "~/Account/myPartial.ascx", но вы упомянули, что ваш пользовательский элемент управления находится в папке Views/Account. Вы пробовали
<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>
или это просто опечатка в вашем вопросе?
Ответ 7
вы должны попробовать это
~/Views/Shared/parts/UMFview.ascx
поместите ~/Views/ перед кодом
Ответ 8
 Создайте пользовательский механизм просмотра и создайте метод, который возвращает 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);
        }
Ответ 9
Попробуйте использовать RenderAction("myPartial","Account");
