none
Problema con form en partialView RRS feed

  • Pregunta

  • Hola.

    En mi aplicación tengo un layout que tiene un llamado a un método que muestra un partialView que es formulario para votar una encuesta. 

    Funciona bien, pero cuando el layout se carga en una página que es contiene un form  ej una pagina "Create" cuando hago click en el submit de la encuesta, en lugar de ir al metodo de la encuesta, va al metodo del create.

    alguna idea?

    gracias desde ya

    miércoles, 7 de marzo de 2012 13:23

Respuestas

  • Creo que el problema está en el tipo de método que usas.

    Te posteo el código que tengo de un ejemplo

    Controlador

            public RedirectToRouteResult AddToCart(int Id, string returnUrl)
            {
                Product product = repository.Products.FirstOrDefault(p => p.Id == Id);
                if (product != null)
                    GetCart().AddItem(product, 1);
                
                return RedirectToAction("Index", new { returnUrl });
            }
    

    Vista parcial

    @model SportsStore.Domain.Entities.Product
    
    <div class="divProductListItem">
        <div class="divCartButton">
            @using(Html.BeginForm("AddToCart", "Cart")) 
            {
                @Html.HiddenFor(p => p.Id)
                @Html.Hidden("returnUrl", Request.Url.PathAndQuery)
                <input type="submit" value="Add to cart" />
            }
        </div>
        <div class="divProductData">
            <h2>@Model.Name</h3>
            @Model.Description
            <h3>@Model.Price.ToString("c")</h4>
        </div>
    </div>


    "En los momentos de crisis, sólo la imaginación es más importante que el conocimiento"

    • Marcado como respuesta sepilrat jueves, 8 de marzo de 2012 13:39
    miércoles, 7 de marzo de 2012 15:46

Todas las respuestas

  • Hola sepilrat.

    ¿En la declaración del formulario le estás especificando la acción que debe ejecutar?

    using (Html.BeginForm( (string)ViewData["PostBackAction"], "Candidate", ..


    "En los momentos de crisis, sólo la imaginación es más importante que el conocimiento"

    miércoles, 7 de marzo de 2012 13:56
  • gracias por la respuesta.

    Este es mi partialView:

    @model Lumitech.Models.Buscador
    
    @using (Html.BeginForm("ResolverBusqueda","Buscador")) {
        @Html.ValidationSummary(true)
        <fieldset>
            <legend>Buscador</legend>
    
            <div class="editor-label">
                @Html.LabelFor(model => model.TerminoBusqueda, Resources.Lenguajes.SearchText)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.TerminoBusqueda)
                @Html.ValidationMessageFor(model => model.TerminoBusqueda)
            </div>
     
            <p>
                <input type="submit" value="Buscar" />
            </p>
        </fieldset>
    }
    

    El controlador

       public PartialViewResult Buscar()
            {
                
                return PartialView();
            }
    
            [HttpPost]
            public ActionResult ResolverBusqueda(Buscador buscador)
            {
              
                var productos = from p in db.Productos 
                                where p.Nombre.Contains(buscador.TerminoBusqueda)
                                ||p.DescripcionEspaniol.Contains(buscador.TerminoBusqueda) 
                                ||p.DescripcionIngles.Contains(buscador.TerminoBusqueda) 
                                select p;
                
                if(buscador.DisponibleStock)
                {
                productos = from p in productos where p.Stock > 0 select p;
                }
                Double PrecioDesde;
                if(double.TryParse(buscador.PrecioDesde.ToString(), out PrecioDesde))
                {
                productos = from p in productos where p.PrecioUnitario > buscador.PrecioDesde select p;
                }
    
                Double PrecioHasta;
                if (double.TryParse(buscador.PrecioDesde.ToString(), out PrecioHasta))
                {
                 productos = from p in productos where p.PrecioUnitario < buscador.PrecioHasta select p;
                }
    
    
    
                return View(productos);
            }
        }
    una porción del layout don de llamo a la partialView que carga los formularios
    <div id="sidebar">
                    <ul>
                    <li>
    							<h2>Buscador</h2>
    							 @{Html.RenderAction("Buscar", "Buscador");}
    						</li>
                    <li>
                   
                     </ul>
                       @{Html.RenderAction("ClienteLogged","Cliente");}
    					<ul>
    						<li>
    							
    							<div style="clear: both;">&nbsp;</div>
    						</li>
    						<li>
    							<
    
    						</li>
    						<li>
    	<h2>Encuestas</h2>
    							 @{Html.RenderAction("VotarEncuesta", "Encuesta");}
    						</li>
    						<li>
    							 

    cuando presiono buscar, va al método Votar encuesta del encuestaControlle en lugar de ir al resolverBusqueda del  buscadorController


    miércoles, 7 de marzo de 2012 15:11
  • Debugueando veo que en realidad primero va al método ResolverBusqueda, pero despues parsea el layput de la vista de resultados y cuando carga la encuesta, es ahí donde va al httpPost de la encuesta.
    miércoles, 7 de marzo de 2012 15:23
  • Creo que el problema está en el tipo de método que usas.

    Te posteo el código que tengo de un ejemplo

    Controlador

            public RedirectToRouteResult AddToCart(int Id, string returnUrl)
            {
                Product product = repository.Products.FirstOrDefault(p => p.Id == Id);
                if (product != null)
                    GetCart().AddItem(product, 1);
                
                return RedirectToAction("Index", new { returnUrl });
            }
    

    Vista parcial

    @model SportsStore.Domain.Entities.Product
    
    <div class="divProductListItem">
        <div class="divCartButton">
            @using(Html.BeginForm("AddToCart", "Cart")) 
            {
                @Html.HiddenFor(p => p.Id)
                @Html.Hidden("returnUrl", Request.Url.PathAndQuery)
                <input type="submit" value="Add to cart" />
            }
        </div>
        <div class="divProductData">
            <h2>@Model.Name</h3>
            @Model.Description
            <h3>@Model.Price.ToString("c")</h4>
        </div>
    </div>


    "En los momentos de crisis, sólo la imaginación es más importante que el conocimiento"

    • Marcado como respuesta sepilrat jueves, 8 de marzo de 2012 13:39
    miércoles, 7 de marzo de 2012 15:46
  • Gracias por la respuesta. 

    De esa manera lo tengo, la solución que encontré es darle un nombre diferente al metodo que rcibe el post.

    GRacias por tu tiempo.

    Saludos

    jueves, 8 de marzo de 2012 13:39