Pregunta

Tengo una vista parcial:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DomainModel.Entities.Product>" %>

<div class="item">
    <h3><%= Model.Name %></h3>
    <%= Model.Description %>

    <% using (Html.BeginForm("AddToCart", "Cart")) { %>
        <%= Html.Hidden("ProductID") %>
        <%= Html.Hidden("returnUrl", ViewContext.HttpContext.Request.Url.PathAndQuery) %>
        <input type="submit" value="+ Add to cart" />
    <% } %>

    <h4><%= Model.Price.ToString("c")%></h4>
</div>

Y aquí está el html que se representa:

<div class="item"> 
    <h3>Kayak</h3> 
    A boat for one person
    <form action="" method="post">
        <input id="ProductID" name="ProductID" type="hidden" value="1" /> 
        <input id="returnUrl" name="returnUrl" type="hidden" value="/" /> 
        <input type="submit" value="+ Add to cart" /> 
    </form> 
    <h4>$275.00</h4> 
</div> 

No ocurre nada cuando se hace clic en el botón de envío y estoy bastante seguro de que es porque el atributo de acción de formulario no tiene ningún valor. ¿No debería BeginForm (acción, controlador) hacerse cargo de la acción del formulario? ¿Qué estoy haciendo mal?

EDITAR

Código de la acción AddToCart de CartController:

    public RedirectToRouteResult AddToCart(Cart cart, int productID, string returnUrl)
    {
        Product product = productsRepository.Products.FirstOrDefault(p => p.ProductID == productID);

        cart.AddItem(product, 1);
        return RedirectToAction("Index", new { returnUrl });
    }

EDIT 2

La vista que hace la parcial:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <% foreach (var product in Model) { %>
        <% Html.RenderPartial("ProductSummary", product); %>
    <% } %>

    <div class="pager">
    Page:
    <%=Html.PageLinks((int)ViewData["CurrentPage"],
                      (int)ViewData["TotalPages"],
                      x => Url.Action("List", new { page = x, category = ViewData["CurrentCategory"] })) %>
    </div>
</asp:Content>

EDITAR 3

Rutas:

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            null, // don't need a name
            "", // matches the root URL, i.e. ~/
            new { controller = "Products", action = "List", category = (string)null, page = 1 } //Defaults
        );

        routes.MapRoute(
            null, // don't need name
            "Page{page}", // URL pattern, e.g. ~/Page683
            new { controller = "Products", action = "List", category = (string)null }, // defaults
            new { page = @"\d+" } // constraints: page must be numerical
        );

        routes.MapRoute(null,
            "{category}",
            new { controller = "Products", action = "List", page = 1 });

        routes.MapRoute(null,
            "{category}/Page{page}",
            new { controller = "Products", action = "List" },
            new { page = @"\d+" } // constraints: page must be numerical
        );

    }
¿Fue útil?

Solución

Parece que no tiene una ruta predeterminada configurada. BeginForm usa UrlHelper.GenerateUrl para hacer coincidir los nombres de acción / controlador con su colección de rutas. Entonces, si no tiene una ruta que se asigne a AddToCart , no puede generar una URL para ella. Intente agregar esto al final de sus rutas:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Products", action = "List", id = "" }
);

Otros consejos

Esto es parte del ejemplo de aplicación principal utilizado en el excelente libro 'Pro ASP MVC Framework' de Steven Sanderson.

Curiosamente, cometí exactamente el mismo error y omití la llamada final de .MapRoute que figura en la lista de la página 130.

routes.MapRoute("Default", "controller}/{action}"

Fue la respuesta de Johnny G a esta publicación la que me ayudó a encontrar mi error también.

¡Bonito, Johnny!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top