c# - mvc5 - Render parcial desde carpeta diferente(no compartida)
render partial asp net core (8)
El VirtualPathProviderViewEngine, en el que se basa WebFormsViewEngine, se supone que es compatible con los caracteres "~" y "/" en la parte frontal de la ruta, por lo que sus ejemplos anteriores deberían funcionar.
Noté que sus ejemplos usan la ruta "~ / Account / myPartial.ascx", pero mencionó que su control de usuario está en la carpeta Vistas / Cuenta. Has probado
<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>
¿O es solo un error tipográfico en tu pregunta?
¿Cómo puedo hacer que una vista haga un parcial (control de usuario) desde una carpeta diferente? Con la vista previa 3 solía llamar a RenderUserControl con la ruta completa, pero con la actualización a la vista previa 5 ya no es posible. En su lugar, obtuvimos el método RenderPartial, pero no me ofrece la funcionalidad que estoy buscando.
En mi caso, estaba usando MvcMailer (https://github.com/smsohan/MvcMailer) y quería acceder a una vista parcial desde otra carpeta, que no estaba en "Compartido". Las soluciones anteriores no funcionaron, pero usar una ruta relativa sí funcionó.
@Html.Partial("../MyViewFolder/Partials/_PartialView", Model.MyObject)
He creado una solución que parece estar funcionando bastante bien. Encontré la necesidad de cambiar al contexto de un controlador diferente para buscar el nombre de la acción, ver la búsqueda, etc. Para implementar esto, creé un nuevo método de extensión para HtmlHelper
:
public static IDisposable ControllerContextRegion(
this HtmlHelper html,
string controllerName)
{
return new ControllerContextRegion(html.ViewContext.RouteData, controllerName);
}
ControllerContextRegion
se define como:
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;
}
}
La forma en que se usa dentro de una vista es la siguiente:
@using (Html.ControllerContextRegion("Foo")) {
// Html.Action, Html.Partial, etc. now looks things up as though
// FooController was our controller.
}
Puede haber efectos secundarios no deseados para esto si su código requiere que el componente de ruta del controller
no cambie, pero en nuestro código hasta ahora, no parece haber ningún aspecto negativo en este enfoque.
Intente usar RenderAction("myPartial","Account");
Para un control de usuario llamado myPartial.ascx ubicado en la carpeta Vistas / Cuenta, escriba así:
<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>
Si está utilizando este otro camino la mayor parte del tiempo, puede arreglarlo permanentemente sin tener que especificar el camino todo el tiempo. De forma predeterminada, está comprobando si hay vistas parciales en la carpeta Ver y en la Carpeta compartida. Pero digamos que quieres añadir uno.
Agrega una clase a tu carpeta de Modelos:
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();
}
}
Luego, en su archivo Global.asax.cs, agregue la siguiente línea:
ViewEngines.Engines.Add(new NewViewEngine());
Solo incluye la ruta a la vista, con la extensión de archivo.
Maquinilla de afeitar:
@Html.Partial("~/Views/AnotherFolder/Messages.cshtml", ViewData.Model.Successes)
Motor ASP.NET:
<% Html.RenderPartial("~/Views/AnotherFolder/Messages.ascx", ViewData.Model.Successes); %>
Si ese no es su problema, ¿podría incluir su código que solía trabajar con RenderUserControl?
deberias intentar esto
~/Views/Shared/parts/UMFview.ascx
Coloque el ~/Views/
antes de su código