Answered RenderAction en MasterPage

  • viernes, 18 de marzo de 2011 1:00
     
      Tiene código

    Hola tengo un problema con mi MasterPage, he tratado de incrustar un vista en un div a través de un Html.RenderAction, pero no me funciona, hay alguna restricción que quizá deba conocer?.

    Aqui les dejo el codigo de mi MAsterPage:

    <body>
      
        <asp:ContentPlaceHolder ID="MainContent" runat="server">
        
        <div id= "Cabecera">
        </div>
        <div id= "ColumnaIzquierda">
            <% Html.RenderAction("LlenarDDLSecciones", "Secciones"); %>
        </div>  
        <div id="Contenido">
        </div>
    
        </asp:ContentPlaceHolder> 
        
    </body>
    

    Sucede que esta vista que quiero incrustar es digamos general y se utilizará siempre, incluye un DropDownList y una lista que se llena a partir de la selección del DropDownList, en fin me sirve como menú. Ojala mi consulta este clara. Estaré atento a las sugerencias.

    Saludos cordiales

Todas las respuestas

  • viernes, 18 de marzo de 2011 8:01
     
     

    Buenas Richof!

    A priori debería funcionarte.

    Comprobaciones:

    1. Breakpoint en accion "LLenarDDLSecciones" del controlador "Secciones" -> Te invoca el método?
    2. Con las developer tools de Chrome/IE o con el FireBug de Firefox mira la sección de "Network". A ver si la petición GET a /Secciones/LLenarDDLSecciones te está devolviendo algún error 500...

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis
  • viernes, 18 de marzo de 2011 18:00
     
     

    Buenas Richof!

    A priori debería funcionarte.

    Comprobaciones:

    1. Breakpoint en accion "LLenarDDLSecciones" del controlador "Secciones" -> Te invoca el método?
    2. Con las developer tools de Chrome/IE o con el FireBug de Firefox mira la sección de "Network". A ver si la petición GET a /Secciones/LLenarDDLSecciones te está devolviendo algún error 500...

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    Hola Eduard he probado lo que me indicas y no, no existe niguna peticion GET a /Secciones/LLenarDDLSecciones, he colocado el breakpoint  en el controlador en la acccion LlenarDDLSecciones y parace que la compilacion no llega a esa linea de codigo, no entiendo que pueda ser, algun otro consejo?

    Saludos 

  • viernes, 18 de marzo de 2011 20:32
     
      Tiene código

    Buenas.

    Es posible que se deba a que estás haciendo la llamada a RenderAction() en el interior de un ContentPlaceHolder.

    Todo lo que está entre la apertura y cierre del tag ContentPlaceHolder (los tags e incluso la llamada a RenderAction) actúa como contenido por defecto para esa sección, y será ejecutado sólo si las vistas que usan esta master no tienen definido ningún contenido para ella.

    Por tanto, para que te funcionara tendrías que sacarlo de ahí, por ejemplo como en el siguiente código:

    <body>
      <div id= "Cabecera">
      </div>
      <div id= "ColumnaIzquierda">
        <% Html.RenderAction("LlenarDDLSecciones", "Secciones"); %>
      </div> 
      <div id="Contenido">
      <span style="background-color:yellow"><asp:ContentPlaceHolder ID="MainContent" runat="server"></asp:ContentPlaceHolder> </span>
      </div> 
    </body>
    
    

    Suerte!


    José M. Aguilar
    Variable not found
  • viernes, 18 de marzo de 2011 20:53
     
      Tiene código

    Buenas.

    Es posible que se deba a que estás haciendo la llamada a RenderAction() en el interior de un ContentPlaceHolder.

    Todo lo que está entre la apertura y cierre del tag ContentPlaceHolder (los tags e incluso la llamada a RenderAction) actúa como contenido por defecto para esa sección, y será ejecutado sólo si las vistas que usan esta master no tienen definido ningún contenido para ella.

    Por tanto, para que te funcionara tendrías que sacarlo de ahí, por ejemplo como en el siguiente código:

    <body>
     <div id= "Cabecera">
     </div>
     <div id= "ColumnaIzquierda">
     <% Html.RenderAction("LlenarDDLSecciones", "Secciones"); %>
     </div> 
     <div id="Contenido">
     <span style="background-color:yellow"><asp:ContentPlaceHolder ID="MainContent" runat="server"></asp:ContentPlaceHolder> </span>
     </div> 
    </body>
    
    

    Suerte!


    José M. Aguilar
    Variable not found

    Gracias por responder Jose, pero no, eso ya lo intente y creo que es peor, ya que ni siquiera se puede compilar, WebDev.WebServer40.exe deja de funcionar, realmente no tengo ni idea de porque esto no funciona, asi que seguire esperando sus consejos.

    Saludos cordiales


  • sábado, 19 de marzo de 2011 17:03
     
     Respondida

    Buenas,

    pues sí que es raro. El hecho de que te reviente el servidor web puede ser señal de que se está ejecutando, pero que algo en ese código esté provocando el error... en ese caso, algo habríamos mejorado ;-)

    Otras cosas que puedes ver y que quizás puedan darte una pista:

    • Comprobar que no estés retornando desde la acción LlenarDDLSecciones una vista en la que utilizas las Master (provocarías un bucle infinito).
    • Apuntar el RenderAction() hacia otra acción que simplemente tenga en su código un return Content("Hey!"); para comprobar que es invocada.
    • Probar a invocar directamente (desde el navegador) la acción LlenarDDLSecciones, a ver qué te retorna.
    • Intentar aislar ese código de tu aplicación y colgar el proyecto en algún sitio para que podamos estudiarlo en profundidad :-)

    Suerte!


    José M. Aguilar
    Variable not found
    • Marcado como respuesta Richof lunes, 21 de marzo de 2011 2:32
    •  
  • sábado, 19 de marzo de 2011 19:38
     
      Tiene código

    Buenas,

    pues sí que es raro. El hecho de que te reviente el servidor web puede ser señal de que se está ejecutando, pero que algo en ese código esté provocando el error... en ese caso, algo habríamos mejorado ;-)

    Otras cosas que puedes ver y que quizás puedan darte una pista:

    • Comprobar que no estés retornando desde la acción LlenarDDLSecciones una vista en la que utilizas las Master (provocarías un bucle infinito).
    • Apuntar el RenderAction() hacia otra acción que simplemente tenga en su código un return Content("Hey!"); para comprobar que es invocada.
    • Probar a invocar directamente (desde el navegador) la acción LlenarDDLSecciones, a ver qué te retorna.
    • Intentar aislar ese código de tu aplicación y colgar el proyecto en algún sitio para que podamos estudiarlo en profundidad :-)

    Suerte!


    José M. Aguilar
    Variable not found

    Gracias José, probe con el Return Content, con la vista  Prueba que tiene su accion en el controlador Secciones, con esa vista si me funciona, me devuelve el texto que puse en content, tambien probé invocando desde el navegador la accion LlenarDDLSecciones, y tambien me funciona, alguna sugerencia??? Aqui dejo la vista LlenarDDLSecciones:

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/LaOcasion.Master" Inherits="System.Web.Mvc.ViewPage<LaOcasionv03.Models.Secciones>" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    	
      LlenarDDLSecciones
    </asp:Content>
    
    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
     
      <script src="../../Scripts/jquery-1.4.1-vsdoc.js" type="text/javascript"></script>
      <script src="../../Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
      <script src="../../Scripts/jquery-1.4.1.js" type="text/javascript"></script>
      <div id="ListaSecciones">
      <%= Html.DropDownList("ddlSecciones", (SelectList)ViewData["Secciones"])%>
     </div>
      <div id="ListaCategorias"></div>
     <script type="text/javascript">
       $(document).ready(function () {
         $("#ddlSecciones").ready(function () {
    
           $("#ListaCategorias").load("/Categorias/Lista/" + $("#ddlSecciones").val());
    
         });
       $("#ddlSecciones").change(function () {
        var mivalor = $(this).val();
        var url = "<%=Url.Action("Lista", "Categorias", new { id = "param-1" })%>";
        url = url.replace("param-1", mivalor); 
        $("#ListaCategorias").load(url);
       });
    
    });
    </script>
    
      
    
    </asp:Content>
    

    Estare esperando sugerencias.

    Saludos

  • domingo, 20 de marzo de 2011 10:30
     
     

    Richof,

    Estoy con José: si puedes colgar en skydrive o algún sitio un proyecto sólo con ese código que reproduzca el error lo podremos mirar más fácilmente... Porque a mi, honestamente, no se me ocurre ahora mismo que te puede estar sucediendo. He visto que antes tenías el código dentro de un ContentPlaceholder pero eso ya te lo ha indicado José, o sea que si sigue sin funcionarte... Deberíamos poder mirarlo "en vivo" ;-)

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis
  • domingo, 20 de marzo de 2011 10:31
     
     

    Buenas,

    ¿has probado a quitar la masterpage de esa vista? Es decir, eliminar el MasterPageFile="~/Views/Shared/LaOcasion.Master" de las directivas de la página. Como te comenté, provocarías un bucle infinito, que acabaría en un stack overflow...

    Saludos.


    José M. Aguilar
    Variable not found
  • domingo, 20 de marzo de 2011 14:07
     
     

    Hola, gracias a ambos por la atención, José eh intentado quitando la linea que dices y no me funciona, me muestra el siguiente error :

    Los controles de contenido se permiten sólo en la página de contenido que hace referencia a la página maestra.

    Descripción: Excepción no controlada al ejecutar la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código. 

    Detalles de la excepción: System.Web.HttpException: Los controles de contenido se permiten sólo en la página de contenido que hace referencia a la página maestra.

     

    Bueno siguiendo la sugerencia, he colgado mi pequeño proyecto en esta direccion: Mi Proyectito

    Agradecere que le den un vistazo y si ademas encuentran algo que no deba hacerse como lo estoy haciendo, les ruego me lo hagan conocer, como siempre estare atento a las sugerencias.

    Saludos cordiales

     



  • domingo, 20 de marzo de 2011 16:26
     
     Respondida

    Buenas, Richof.

    Confirmado, era lo que te comentaba: tienes un bucle infinito con la página maestra. Si pones un punto de ruptura en tu accción verás que se está ejecutando continuamente: tu vista usa la página maestra, que llama a una acción que retorna otra vista que a su vez usa la maestra, que llama a otra vista que a su vez una la maestra, etc.

    Para solucionarlo, simplemente debes eliminar la directiva MasterPage (como te indicaba en el mensaje anterior). El error "Los controles de contenido se permiten sólo en la página..." te aparece porque al no tener maestra, también debes eliminar las secciones <asp:content>.

    De todas formas, una observación: el resultado de la acción LlenarDDLSecciones() debería ser una vista parcial (estás generando sólo una porción de la página), y no una vista completa como tienes ahora. Es decir, la acción LlenarDDLSecciones() debería acabar con un return PartialView(secciones). Y por supuesto, la vista LlenarDDLSecciones debería ser un .ascx (vista parcial).

    Saludos!

     


    José M. Aguilar
    Variable not found
    • Marcado como respuesta Richof lunes, 21 de marzo de 2011 2:31
    •  
  • domingo, 20 de marzo de 2011 18:48
     
     

    Bien, con la vista parcial si funciona, solo hay un detalle mas, en la vista parcial LlenarDDLSecciones tengo una lista que apunta a otra vista parcial, AnunciosxCategoria, esta vista se muestra en el div contenido de mi masterpage, solo que incluye tambien la vista parcial LlenarDDLSecciones dentro del contenido, para aclarar: la vista parcial LlenarDDLSecciones solo debe mostrarse en el div Columna del masterpage, pero al dar click en las categorias de esa vista, muestra la vista objetivo( AnunciosxCategoria) con la vista parcial LlenarDDLSecciones de nuevo en el div contenido. Ojala este claro este asunto, algun consejo para solucionarlo?

    Saludos

  • domingo, 20 de marzo de 2011 19:45
     
     Respondida

    Richof,

    El problema que tienes es el mismo: hay vistas parciales que no las tienes definidas como parciales sino como vistas completas, y al cargar su contenido sobre la página vuelves a introducir la página maestra, de ahí que te salga repetido lo que tienes definido en ella.

    Intenta convertir a parcial todo lo que sea parcial; es decir, las vistas que sólo representen una porción de la página siempre deben estar en un .ascx, y ser invocadas como vistas parciales. Con esto desaparecerá tu problema.

    Saludos.


    José M. Aguilar
    Variable not found
    • Marcado como respuesta Richof lunes, 21 de marzo de 2011 2:31
    •