这是我的控制器签名:
public class CartController : Controller
{
public ActionResult Index()
{
CartViewModel cartViewModel = _cartRepository.GetCart(SessionVariables.CartId);
return View(cartViewModel);
}
public ActionResult List()
{
return View();
}
[Authorize]
public ActionResult AddToCart(int productId, int quantity = 1)
{
return RedirectToAction("Index");
}
[HttpPost]
[ActionName("AddToCart")]
public ActionResult AddToCartFromDetails(int productId = 0, int quantity = 1)
{
return RedirectToAction("AddToCart", new {productId , quantity});
}
}
这是我在Global.asax上的路线:
routes.MapRouteLowerCase(
"AddToCart", // Route name
"products/addtocart/{productId}", // URL with parameters
new { controller = "Cart", action = "AddToCart", productId = UrlParameter.Optional } // Parameter defaults
);
这是我的表单,它不会转到我的CartController上的[HttpPost]操作:
@using (Html.BeginForm("AddToCart", "Cart", null, FormMethod.Post, null))
{
<div class="quantity-container">
<div>
Quantity :</div>
<input type="text" name="quantity" value="1" />
<input type="hidden" name="productId" value="@Model.ItemDetails.ItemMasterId" />
</div>
<div class="buy-btn-container">
<input type="image" src="@Url.Content("~/Content/Images/buynow_btn.png")" alt="Buy"/>
</div>
<div class="clear">
</div>
}
表格的网址确实解析为我在上面设置的路线:
/products/addtocart
答案 0 :(得分:0)
您的操作名称“添加到购物车”使用两次相同的参数(两个整数,两个都是可选的引导),因此当必须路由匹配的URL时,MVC无法区分。
答案 1 :(得分:0)
将您的路线置于global.asax
的默认路线之上。它匹配默认路由和您的特定路由。因此,MVC使用它首先找到的那个。
似乎MVC在BeginForm中做了一些奇怪的事情,因为你的路由适用于GET?因此我会转而使用BeginRouteForm: