Frage

Ich habe eine Teilansicht:

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

Und hier ist der HTML-Code, gerendert wird:

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

Nichts geschieht, wenn der Submit-Button geklickt wird, und ich bin ziemlich sicher, dass es ist, weil das Formular action-Attribut keinen Wert hat. Sollte nicht Begin (Aktion, Controller) kümmern sich um die Form Aktion Rendern? Was mache ich falsch?

EDIT

-Code von CartController AddToCart Aktion:

    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

Die Ansicht, dass die teilweise macht:

<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

Routen:

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

    }
War es hilfreich?

Lösung

Es sieht aus wie Sie eingerichtet nicht eine Standardroute haben. BeginForm verwendet UrlHelper.GenerateUrl die Aktion / Controller-Namen zu Ihrer Route Sammlung zusammenpassen. Also, wenn Sie nicht über eine Route, die AddToCart abbildet, dann kann es keine URL für sie generieren. Versuchen Sie, diese Ihrer Routen auf den Boden und fügte hinzu:

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

Andere Tipps

Dies ist von dem Haupt Beispiel Anwendung in Steven Sanderson ausgezeichnet 'Pro ASP MVC-Framework' Buch verwendet wird.

Komischerweise habe ich genau die gleichen Fehler und den letzten .MapRoute Aufruf ausgelassen in der Liste auf Seite 130 gegeben.

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

Es war die Antwort von Johnny G zu diesem Beitrag, die mir geholfen, meinen Fehler als auch zu finden.

Nice one Johnny!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top