Question

J'ai une vue partielle:

<%@ 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>

Et voici le code HTML qui est rendu:

<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> 

Rien ne se produit lorsque l'utilisateur clique sur le bouton d'envoi et je suis presque certain que c'est parce que l'attribut d'action de formulaire n'a aucune valeur. BeginForm (action, contrôleur) ne devrait-il pas s'occuper du rendu de l'action de formulaire? Qu'est-ce que je fais mal?

EDIT

Code de l'action 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 vue qui rend le partiel:

<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>

EDIT 3

Itinéraires:

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
        );

    }
Était-ce utile?

La solution

Il semble que vous n’ayez pas défini de route par défaut. BeginForm utilise UrlHelper.GenerateUrl pour faire correspondre les noms d'action / contrôleur à votre collection de routes. Ainsi, si vous n'avez pas d'itinéraire qui mappe vers AddToCart , il ne peut pas générer d'adresse URL pour celui-ci. Essayez d’ajouter ceci au bas de vos itinéraires:

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

Autres conseils

Ceci est tiré du principal exemple d'application utilisé dans l'excellent livre "Pro ASP MVC Framework" de Steven Sanderson.

Étrangement, j’ai commis exactement la même erreur et omis l’appel final .MapRoute donné dans la liste à la page 130.

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

C’est la réponse de Johnny G à cet article qui m’a aussi aidé à trouver mon erreur.

Sympa Johnny!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top