ASP.NET MVC Html.BeginForm Проблема - PullRequest
9 голосов
/ 16 июня 2009

У меня есть частичное представление:

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

А вот HTML, который отображается:

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

Ничего не происходит, когда нажимается кнопка отправки, и я уверен, что это потому, что атрибут действия формы не имеет значения. Не должен ли BeginForm (action, controller) позаботиться о выводе действия формы? Что я делаю не так?

EDIT

Код из действия AddCoCart 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 });
    }

РЕДАКТИРОВАТЬ 2

Представление, которое отображает частичное:

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

РЕДАКТИРОВАТЬ 3

Маршруты:

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

    }

Ответы [ 2 ]

15 голосов
/ 16 июня 2009

Похоже, у вас не настроен маршрут по умолчанию. BeginForm использует UrlHelper.GenerateUrl, чтобы сопоставить имена действий / контроллеров с вашей коллекцией маршрутов. Поэтому, если у вас нет маршрута, который отображается на AddToCart, он не сможет сгенерировать для него URL. Попробуйте добавить это в конец ваших маршрутов:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Products", action = "List", id = "" }
);
0 голосов
/ 27 октября 2009

Это пример основного приложения, использованного в превосходной книге Стивена Сандерсона «Pro ASP MVC Framework».

Как ни странно, я совершил точно такую ​​же ошибку и пропустил последний вызов .MapRoute, указанный в листинге на стр. 130.

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

Именно ответ Джонни Дж. На этот пост помог мне найти и мою ошибку.

Отличный Джонни!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...