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





Просто укажите путь к представлению с расширением файла.
Бритва:
@Html.Partial("~/Views/AnotherFolder/Messages.cshtml", ViewData.Model.Successes)
Двигатель ASP.NET:
<% Html.RenderPartial("~/Views/AnotherFolder/Messages.ascx", ViewData.Model.Successes); %>
Если это не ваша проблема, не могли бы вы включить свой код, который использовался для работы с RenderUserControl?
@Simon_Weaver Вы можете этого добиться. Один из способов - изменить ViewEngine и переопределить его метод FindPartialView с помощью чего-то вроде if (partialViewName.Contains"/")partialViewName = "~/Views/"+partialViewName;.
Также работает в движке MVC 3 Razor, но, как и в предыдущем случае, вам потребуется расширение (.cshtml).
Если он находится под другим, вам нужно будет указать путь "~ / Areas / TestArea / Views / Shared / _SomePartial.mobile.cshtml"
Как вы справляетесь с различными культурами этого частичного представления (например, ~ / Views / AnotherFolder / Messages.en.cshtml)?
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");
Пожалуйста, прочтите вопрос, поскольку пользователь спрашивает о просмотре в другой папке, где находится папка в вашем коде?
Я создал обходной путь, который, кажется, работает очень хорошо. Я обнаружил необходимость переключиться в контекст другого контроллера для поиска имени действия, просмотра и т. д. Чтобы реализовать это, я создал новый метод расширения для 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") для использования общей папки.
Я обнаружил, что это не работает без расширения .cshtml в конце.
Если вы часто используете этот другой путь, вы можете исправить это навсегда, не указывая путь все время. По умолчанию он проверяет наличие частичных представлений в папке «Просмотр» и в общей папке. Но скажите, что вы хотите добавить один.
Добавьте класс в папку 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());
Конечно, я понимаю, что этот вопрос задавали очень давно. Подумал, что добавлю к нему для будущих гуглеров и будущих Бингеров.
- Не будет работать в .Net Core 2.2, так как RazorViewEngine.PartialViewLocationFormats не существует.
Создайте настраиваемый механизм просмотра и получите метод, который возвращает 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);
}
Для читателей, использующих 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 тоже полезна.
Хотелось бы, чтобы мы могли просто сказать / AnotherFolder / Messages