net mvc asp asp.net-mvc renderpartial

asp.net-mvc - asp - renderaction mvc



ASP.Net MVC y RenderPartial con rutas relativas (3)

Porque estaba llamando a RenderAction () desde una vista en Producto

...

No entiendo por qué necesitaba especificar la ruta completa de la vista. Tendría sentido para mí que el nombre relativo se interprete en relación con la ruta de la vista actual en lugar de la ruta de vista del controlador original

La parte que creo que está malinterpretando es el "lugar de ejecución" por falta de un término mejor u oficial. Las rutas no son relativas a su vista, ni siquiera su "vista de controlador" como usted lo expresó. Son relativos a su URL de solicitud, que define un contexto de controlador. Puede que no lo esté diciendo muy bien, pero si pasaste un poco de tiempo en Reflector mirando cómo se resuelven las URL y las rutas, creo que todo esto encajará en tu cabeza.

He estado jugando con ASP.NET MVC y tenía una pregunta. O tal vez es una preocupación que estoy haciendo esto mal. Solo estoy trabajando en un sitio cojo para estirar mis alas un poco. Lamento que esta pregunta no sea del todo concisa.

Ok, aquí está el escenario. Cuando el usuario visita home / index, la página debe mostrar una lista de productos y una lista de artículos. El diseño del archivo es tal (DAL es mi capa de acceso a datos):

Controllers Home Index Views Home Index inherits from ViewPage Product List inherits from ViewUserControl<IEnumerable<DAL.Product>> Single inherits from ViewUserControl<DAL.Product> Article List inherits from ViewUserControl<IEnumerable<DAL.Article>> Single inherits from ViewUserControl<DAL.Article>

Controllers.HomeController.Index produces a View whose ViewData contains two entries, a IEnumerable<DAL.Product> and a IEnumerable<DAL.Article>. View.Home.Index will use those view entries to call: Html.RenderPartial("~/Views/Product/List.ascx", ViewData["ProductList"]) and Html.RenderPartial("~/Views/Article/List.ascx", ViewData["ArticleList"]) View.Product.List will call foreach(Product product in View.Model) Html.RenderPartial("Single", product); View.Article.List does something similar to View.Product.List

Sin embargo, este enfoque falla. El enfoque tiene sentido para mí, pero tal vez alguien con más experiencia con estas plataformas MVC reconocerá una mejor manera.

Lo anterior produce un error dentro de View.Product.List. La llamada a Html.RenderPartial("Single",...) queja de que no se encontró la vista "Única". El error indica:

The partial view ''Single'' could not be found. The following locations were searched: ~/Views/Home/Single.aspx ~/Views/Home/Single.ascx ~/Views/Shared/Single.aspx ~/Views/Shared/Single.ascx

Como llamaba a RenderAction () desde una vista en Producto, esperaba que el tiempo de ejecución buscara la vista "Única" en Vistas / Producto. Sin embargo, parece que la búsqueda es relativa al controlador que invocó la vista original (/ Controlador / Inicio invocado / Vistas / Producto) en lugar de la vista actual.

Así que puedo solucionarlo cambiando las vistas / Producto, de modo que:

View.Product.List will call foreach(Product product in View.Model) Html.RenderPartial("~/Views/Product/Single.ascx", product);

en lugar de

View.Product.List will call foreach(Product product in View.Model) Html.RenderPartial("Single", product);

Esta solución funciona pero ... No entiendo por qué necesitaba especificar la ruta completa de la vista. Para mí, tendría sentido que el nombre relativo se interpretara en relación con la ruta de la vista actual en lugar de la ruta de vista del controlador original. No puedo pensar en ningún caso útil en el que sea útil interpretar el nombre relativo a la vista del controlador en lugar de la vista actual (excepto en el caso típico donde son iguales).

¿Alrededor de este tiempo debería tener un signo de interrogación? Para enfatizar esto en realidad es una pregunta.


Al mirar la muestra MVCStoreFront, así es como tienen todo estructurado para llamar a RenderPartial

Views Shared ProductSingle ProductList ArticleSingle ArticleList

Luego renderízalos a través de:

<% Html.RenderPartial("ProductSingle", ViewData["ProductList"]); %> <% Html.RenderPartial("ProductList", product); %> <% Html.RenderPartial("ArticleSingle", article); %> <% Html.RenderPartial("ArticleList", ViewData["ArticleList"]); %>


[editar:

Estaba pensando, tienes 2 casos:

  • el controlador Home es el único que hace referencia al control de usuario de la Lista de productos / artículos
  • los controles de usuario son compartidos por varios controladores

En el primer caso, los controles de usuario de la vista realmente pertenecen al controlador del hogar y tiene sentido colocarlos en la carpeta del controlador del hogar. En el segundo caso, tiene sentido colocarlos en la carpeta compartida ya que serán compartidos por los controladores.

En cualquier caso, tal vez puede colocarlos en una subcarpeta. Como Views / Home / Products y luego prueba RendarPartial ("Product / Single") y ve lo que sucede? No sé si trataría de resolverlo en: Inicio / Producto / Individual y luego Compartido / Producto / Único o no. Si las subcarpetas funcionan, parece permitir la separación lógica de Producto y Artículo, al tiempo que muestra que todavía son miembros del Controlador doméstico o Compartido por todos los controladores.

]

Echa un vistazo a esta entrada del blog de Steve Sanderson:

http://blog.codeville.net/2008/10/14/partial-requests-in-aspnet-mvc/

Lo que está haciendo no está mal, pero parece ir en contra de la convención de los nombres de las carpetas View / Controller. Dicho esto, tiene sentido querer definir controles de usuario de vista agnósticos del controlador y anidarlos parece válido. ¡Así que no lo sé!

De todos modos, el enlace simplemente describe un método de en lugar de usar RenderPartial para representar un control de uso, define un método de RenderPartialRequest que representa el valor de retorno (en su caso un control de usuario) de una acción de controlador. De modo que podría agregar un controlador de Producto y Artículos con una Lista de Acciones que devuelva su control de usuario, y luego llamar esas dos acciones desde la vista Inicio / Índice. Esto me parece más intuitivo, pero solo una opinión.

También menciona subcontratistas de MVC Contrib, y estoy bastante seguro de que existe la voluntad de que algo como esto forme parte de ASP.NET MVC.