我有一个ASP .Net核心MVC 2.0应用程序,我按照概述in this video series实现了电子商务网站的购物车。在应用程序中,用户可以输入对表格中显示的项目的搜索查询。可以单击表中的每个项目以显示另一个页面,其中包含该项目的其他详细信息以及“添加到购物车”按钮。
用于搜索,显示项目结果和详细信息页面的站点功能都在一个控制器类中实现为操作,而购物车功能全部在单独的控制器类中实现。
出于某种原因,当我点击&#34;添加到购物车&#34;项目的按钮,请求http://<hostname>/<controllerName>/<controllerACtion>/<id>
形式的URL,但不调用相应的控制器动作。这很奇怪,因为我使用基本相同的代码来调用添加到购物车的操作,就像我显示细节一样。出于这个原因,我认为这个问题与路线的设置有关。
以下是startup.cs中的路由设置:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=resortDeals}/{action=Index}/{id?}");
routes.MapRoute(
name: "shoppingcart",
template: "{controller=ShoppingCartController}/{action=AddToShopingCart}/{id?}");
});
这是购物车控制器结构:
public class ShoppingCartController : Controller
{
public ViewResult Index()
{
...
}
public RedirectToActionResult AddToShopingCart(int dealId)
{
...
}
}
下面是单击“添加到购物车”按钮后如何调用操作的代码:
<div class="addToCart text-right">
<p class="button ">
<a class="btn btn-success" id="cartButton" asp-controller="ShoppingCartController" asp-action="AddToShoppingCart" asp-route-id="@Model.RecNo">
Add to cart
</a>
</p>
</div>
单击按钮后可能阻止调用控制器操作的原因是什么?
答案 0 :(得分:0)
我认为您不需要以下路线,因为默认路线也会处理购物车路线。
template: "{controller=ShoppingCartController}/{action=AddToShopingCart}/{id?}");
另外,试试
<a class="btn btn-success" id="cartButton" asp-controller="ShoppingCart" asp-action="AddToShoppingCart" asp-route-id="@Model.RecNo">
我已从Controller
属性
asp-controller
个字词
此外,将AddToShopingCart方法的输入参数名称更改为id
而不是dealId
public RedirectToActionResult AddToShopingCart(int id)
{
...
}
答案 1 :(得分:0)
我在生产服务器上发布后出现问题,点击按钮时没有响应,我不得不使用Javascript提交按钮。
<div class="addToCart text-right">
<p class="button ">
<button class="btn btn-success" onclick="search(@Model.RecNo)">
Add to cart
</button>
</p>
</div>
<script>
function addToCart(recNo) {
document.getElementById('cartForm').action = "/ShoppingCart/AddToShoppingCart/" + recNo;
document.getElementById('cartForm').submit();
}
</script>