none
Error: No se permiten acciones secundarias para ejecutar acciones de redireccionamiento. RRS feed

  • Pregunta

  • Hola, estoy trabajando con una vista parcial que contiene un pequeño formulario de un textbox y un boton, esta partialview me sirve de buscador, y la tengo incrustada en mi master page, en mi formulario de Registro de usuarios, tengo un captcha, el problema surge cuando trato de actualizar los caracteres del captcha, me muestra este error:

    Para solucionarlo ya que en mi controlador de busquedas, en el metodo BuscarAnunciosBasico devuelvo una PartialView, intente usar Render.Partial en lugar de Render.Action, pero me muestra el siguiente error:

    Aqui les dejo el codigo de mi Partial View:

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<LaOcasionMVC.Helpers.Anuncios.AnunciosBuscadosBasicoPaginados<LaOcasionMVC.Models.Anuncios>>" %>
    <%using (Html.BeginForm("BuscarAnunciosBasico", "Busquedas", FormMethod.Post))
      { %>
    
    <table id="busquedaBasica">
        <tr>
            <td>
                <input type="text" name="Texto" value="<%= ViewData["textoVD"]!=null? ViewData["textoVD"]:"string.Empty"  %>" />
            </td>
            <td>
                <input type="submit" value="Buscar" id="Submit1" />
            </td>
        </tr>
        <tr>
            <%=ViewData["mensaje"]%>
        </tr>
    </table>
    <%} %>
    
    


    Aqui les dejo el codigo de mi controlador:

       public ActionResult BuscarAnunciosBasico(int? pagina)
            {
                const int tamanioPagina = 100;
                var anuncios = AnuncioRepositorio.GetAnuncios();
                IEnumerable<Secciones> secciones = SeccionRepositorio.GetSecciones();
                IEnumerable<Categorias> categorias = CategoriaRepositorio.GetCategorias();
                var anunciosPaginados = new Helpers.Anuncios.AnunciosBuscadosBasicoPaginados<Anuncios>(anuncios, pagina ?? 0, tamanioPagina);
    
                ViewData["idCategoriaVD"] = "";
                ViewData["CiudadVD"] = "";
                ViewData["MotivoVD"] = "";
                ViewData["textoVD"] = "";
                return PartialView(anunciosPaginados);
     
            }
             [HttpPost]
             public ActionResult BuscarAnunciosBasico(string texto)
             {
                 if (texto == null)
                     texto = "";
                 IQueryable<Anuncios> anuncios = BusquedasRepositorio.GetBuscados(null,null,null,texto).ToList<Anuncios>().AsQueryable();
                 TempData["ListaAnuncios"] = anuncios;
                 return RedirectToAction("ResultadoDeBusqueda", "Busquedas");
             }
            public ActionResult ResultadoDeBusqueda(int? pagina)
            {
                IQueryable<Anuncios> anuncios = TempData["ListaAnuncios"] as IQueryable<Anuncios>;
               
                const int tamanioPagina = 20;
                IEnumerable<Secciones> secciones = SeccionRepositorio.GetSecciones();
                IEnumerable<Categorias> categorias = CategoriaRepositorio.GetCategorias();
                var anunciosPaginados = new AnunciosBuscadosPaginados<Anuncios>(anuncios, pagina ?? 0, tamanioPagina, categorias, secciones);
                TempData["ListaAnuncios"] = anuncios;
                return View(anunciosPaginados);
            }
    
    


    Espero haberlo dejado claro, estaré atento a sus consejos. De antemano muchas gracias.

    Saludos cordiales

     

     

     

     

     

    lunes, 17 de octubre de 2011 12:32

Respuestas

  • hola Daniel,

    Muchas gracias por responder, el metodo adornado con el HttpPost es necesario, en realidad es el que realiza la busqueda y redirecciona a una View(.aspx) donde se listan los resultados, pero ya solucione el problema, lo hice usando Render.Partial en lugar de Render.Action, las cosas quedaron asi:

    En la MasterPage:

     

     
     <%Html.RenderPartial("BuscarAnunciosBasico"); %>
    

     


    En el controlador:

     

      public ActionResult BuscarAnunciosBasico()
            {
              
    
                ViewData["idCategoriaVD"] = "";
                ViewData["CiudadVD"] = "";
                ViewData["MotivoVD"] = "";
                ViewData["textoVD"] = "";
                
                return PartialView();
               
     
            }
             [HttpPost]
             public ActionResult BuscarAnunciosBasico(string texto)
             {
                 if (texto == null)
                     texto = "";
                 IQueryable<Anuncios> anuncios = BusquedasRepositorio.GetBuscados(null,null,null,texto).ToList<Anuncios>().AsQueryable();
                 TempData["ListaAnuncios"] = anuncios;
                 return RedirectToAction("ResultadoDeBusqueda", "Busquedas");
             }
            public ActionResult ResultadoDeBusqueda(int? pagina)
            {
                IQueryable<Anuncios> anuncios = TempData["ListaAnuncios"] as IQueryable<Anuncios>;
               
                const int tamanioPagina = 20;
                IEnumerable<Secciones> secciones = SeccionRepositorio.GetSecciones();
                IEnumerable<Categorias> categorias = CategoriaRepositorio.GetCategorias();
                var anunciosPaginados = new AnunciosBuscadosPaginados<Anuncios>(anuncios, pagina ?? 0, tamanioPagina, categorias, secciones);
                TempData["ListaAnuncios"] = anuncios;
                return View(anunciosPaginados);
            }
    

     


    El detalle esta en la PartialView, que antes recibia un modelo como este:

     

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<LaOcasionMVC.Helpers.Anuncios.AnunciosBuscadosBasicoPaginados<LaOcasionMVC.Models.Anuncios>>" %>
    

     


    y ahora solo quedo asi:

     

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
    <%using (Html.BeginForm("BuscarAnunciosBasico", "Busquedas", FormMethod.Post))
      { %>
    
    <table id="busquedaBasica">
        <tr>
            <td>
                <input type="text" name="Texto" value="<%= ViewData["textoVD"]%>" /> <%--ViewData["textoVD"]!=null? ViewData["textoVD"]:string.Empty  %>" />--%>
            </td>
            <td>
                <input type="submit" value="Buscar" id="Submit1" />
            </td>
        </tr>
        <tr>
            <%=ViewData["mensaje"]%>
        </tr>
    </table>
    <%} %>
    

     


    Y claro para poder invocar la PartialView sin problemas, la pùse en la carpeta Shared.

    Ahora todo funciona bien ( ó  almenos por el momento :S )

    Ojala le sirva a alguien.

    Gracias de nuevo.

    Saludos cordiales.

     

     


    • Editado Richof martes, 18 de octubre de 2011 15:19
    • Marcado como respuesta Richof domingo, 30 de octubre de 2011 18:23
    martes, 18 de octubre de 2011 15:18

Todas las respuestas

  • Hola,

    Tu problema radica en que tienes estos dos métodos:

    public ActionResult BuscarAnunciosBasico(int? pagina);

    [HttpPost]
    public ActionResult BuscarAnunciosBasico(string texto);

    Cuando la llamada al template la haces desde una petición GET, el RenderAction está ejecutando el primer método, pero tu problema es que el refrescar el captcha hará una llamada POST, por tanto se está ejecutando el segundo método, que hace una redirección, que no está permitida en un RenderAction.

    La solución más fácil que se me ocurre sería cambiar el nombre de la acción POST, por tanto siempre se ejecutará el primer método, aunque tendrías que modificar la dirección de los formularios que hacía POST a ese método.

     

    Un Saludo!

    martes, 18 de octubre de 2011 7:20
  • hola Daniel,

    Muchas gracias por responder, el metodo adornado con el HttpPost es necesario, en realidad es el que realiza la busqueda y redirecciona a una View(.aspx) donde se listan los resultados, pero ya solucione el problema, lo hice usando Render.Partial en lugar de Render.Action, las cosas quedaron asi:

    En la MasterPage:

     

     
     <%Html.RenderPartial("BuscarAnunciosBasico"); %>
    

     


    En el controlador:

     

      public ActionResult BuscarAnunciosBasico()
            {
              
    
                ViewData["idCategoriaVD"] = "";
                ViewData["CiudadVD"] = "";
                ViewData["MotivoVD"] = "";
                ViewData["textoVD"] = "";
                
                return PartialView();
               
     
            }
             [HttpPost]
             public ActionResult BuscarAnunciosBasico(string texto)
             {
                 if (texto == null)
                     texto = "";
                 IQueryable<Anuncios> anuncios = BusquedasRepositorio.GetBuscados(null,null,null,texto).ToList<Anuncios>().AsQueryable();
                 TempData["ListaAnuncios"] = anuncios;
                 return RedirectToAction("ResultadoDeBusqueda", "Busquedas");
             }
            public ActionResult ResultadoDeBusqueda(int? pagina)
            {
                IQueryable<Anuncios> anuncios = TempData["ListaAnuncios"] as IQueryable<Anuncios>;
               
                const int tamanioPagina = 20;
                IEnumerable<Secciones> secciones = SeccionRepositorio.GetSecciones();
                IEnumerable<Categorias> categorias = CategoriaRepositorio.GetCategorias();
                var anunciosPaginados = new AnunciosBuscadosPaginados<Anuncios>(anuncios, pagina ?? 0, tamanioPagina, categorias, secciones);
                TempData["ListaAnuncios"] = anuncios;
                return View(anunciosPaginados);
            }
    

     


    El detalle esta en la PartialView, que antes recibia un modelo como este:

     

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<LaOcasionMVC.Helpers.Anuncios.AnunciosBuscadosBasicoPaginados<LaOcasionMVC.Models.Anuncios>>" %>
    

     


    y ahora solo quedo asi:

     

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
    <%using (Html.BeginForm("BuscarAnunciosBasico", "Busquedas", FormMethod.Post))
      { %>
    
    <table id="busquedaBasica">
        <tr>
            <td>
                <input type="text" name="Texto" value="<%= ViewData["textoVD"]%>" /> <%--ViewData["textoVD"]!=null? ViewData["textoVD"]:string.Empty  %>" />--%>
            </td>
            <td>
                <input type="submit" value="Buscar" id="Submit1" />
            </td>
        </tr>
        <tr>
            <%=ViewData["mensaje"]%>
        </tr>
    </table>
    <%} %>
    

     


    Y claro para poder invocar la PartialView sin problemas, la pùse en la carpeta Shared.

    Ahora todo funciona bien ( ó  almenos por el momento :S )

    Ojala le sirva a alguien.

    Gracias de nuevo.

    Saludos cordiales.

     

     


    • Editado Richof martes, 18 de octubre de 2011 15:19
    • Marcado como respuesta Richof domingo, 30 de octubre de 2011 18:23
    martes, 18 de octubre de 2011 15:18
  • Hola,

    Me alegro de que lo hayas solucionado.

    Esa solución el único problema que veo es que no ejecuta el código del controlador para mostrar la búsqueda, pero si en tu caso no te hace falta código en el controlador, entonces perfecto.

    Yo lo único que te decía era que cambiaras el nombre de una de las dos acciones para que así seleccione la acción que devuelve la vista parcial siempre.

    Pero si ya lo has resuelto, perfecto!

     

    Un saludo!

    martes, 18 de octubre de 2011 17:54
  • Buenas , yo tengo un problema similar ,  tengo un controlador con las operaciones para editar un registro algo como esto

            // GET: Clientes/Edit/5
            public ActionResult Edit(int id, string weblogin, byte tienda)
            {
                if (id <= 0)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
                Clientes clientes = db.Clientes.First(x => x.id == id && x.weblogin == weblogin && x.tienda == tienda);
    
                if (clientes == null)
                {
                    return HttpNotFound();
                }
                return View(clientes);
            }
    
            // Para protegerse de ataques de publicación excesiva, habilite las propiedades específicas a las que desea enlazarse. Para obtener 
            // más información vea http://go.microsoft.com/fwlink/?LinkId=317598.
            [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Edit([Bind(Include = "id,nombre,apellido1,apellido2,....")] Clientes clientes)
            {
                if (ModelState.IsValid)
                {
                    db.Entry(clientes).State = EntityState.Modified;
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
    
                return View(clientes);
            }
    


    Si lo invoco desde el controlador/Edit/parametros me carga el formulario correspondiente para editar los datos y me deja  guardar los datos que invoca al segundo action result

    Ahora intento poner esto de un formulario que contiene unos tabs el código es este

            <div role="tabpanel" class="tab-pane" id="second">
                @{
                    Html.RenderAction("Edit", "Clientes", new
                    {
                        weblogin = Model.clientes.weblogin,
                        id = Model.clientes.id,
                        tienda = Model.clientes.tienda,
                    });
                }
            </div>
    

    El error que me da es este

    [InvalidOperationException: No se permiten acciones secundarias para ejecutar acciones de redireccionamiento.]
       System.Web.Mvc.RedirectToRouteResult.ExecuteResult(ControllerContext context) +164

    Espero vuestros comentarios / sugerencias.

    Gracias

    • Editado golfgti6 lunes, 15 de mayo de 2017 17:13
    lunes, 15 de mayo de 2017 17:12