ASP.NET Проблема с MVC Html.BeginForm
-
05-07-2019 - |
Вопрос
У меня есть частичное представление:
<%@ 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 (действие, контроллер) не должен заботиться о рендеринге действия формы?Что я делаю не так?
Редактировать
Код из CartController AddToCart действие:
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
);
}
Решение
Похоже, у вас не настроен маршрут по умолчанию. BeginForm
использование UrlHelper.GenerateUrl
чтобы сопоставить имена действий / контроллеров с вашей коллекцией маршрутов.Итак, если у вас нет маршрута, который соответствует AddToCart
, то он не может сгенерировать для него URL-адрес.Попробуйте добавить это в нижнюю часть ваших маршрутов:
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Products", action = "List", id = "" }
);
Другие советы
Это из основного примера приложения, используемого в превосходной книге Стивена Сандерсона "Pro ASP MVC Framework".
Как ни странно, я допустил точно такую же ошибку и опустил заключительный .Вызов MapRoute приведен в списке на странице 130.
routes.MapRoute("Default", "controller}/{action}"
Именно ответ Джонни Джи на этот пост также помог мне найти свою ошибку.
Молодец, Джонни!