Ajax.Begin表单无法呈现正确的操作.NET mvc4

时间:2016-08-29 22:56:13

标签: jquery ajax asp.net-mvc asp.net-mvc-4 ajax.beginform

我的Ajax表单遇到了一个奇怪的问题。我想在用户点击添加到购物车按钮时发布到我的购物车控制器。我只是想从隐藏字段发布产品ID,并返回一个字符串并使用成功的失败消息更新div。我认为以下Razor标记......

@using (Ajax.BeginForm("AddToCart", "Carts", new AjaxOptions { OnSuccess="OnSuccess", HttpMethod="Post", Url="/Carts/AddToCart/"  }, new { @style = "display:inline-block"}))
        {
            @Html.HiddenFor(model => model.Product_ID)
            <input type="submit" class="button round large primary" value="Add To Cart" />
        }

在我的购物车控制器中,我将以下代码添加到购物车,并返回一个字符串,我可以使用javascript来更新我要显示消息的div或者为我设置框架。

[AcceptVerbs(HttpVerbs.Post)]
        public ActionResult AddToCart(int product_ID)
        {
            if (db.Products.Any(product => product.Product_ID == product_ID))
            {
                //var successfulAddToCart = false;
                var cartItem = new Cart();

               // cartItem.CartID = Guid.NewGuid();

                if (Request.IsAuthenticated)
                {
                    cartItem.Customer = db.Customers.FirstOrDefault(customer => customer.Email == User.Identity.Name);
                }                    
                else//not logged in, need to remember them somehow
                {

                    var CartCookie = new HttpCookie("CartID", Guid.NewGuid().ToString());
                    CartCookie.Expires.AddDays(2);
                    Request.Cookies.Add(CartCookie);
                    cartItem.Customer = new Customer();
                }


                cartItem.IsCheckedOut = false;
                cartItem.Quantity = 1;
                cartItem.Sku = db.SKU_Table.FirstOrDefault(sku => sku.Product_ID == product_ID);

                db.Cart.Add(cartItem);
                db.SaveChanges();


                return Content("Add to cart was successful");
            }
            else
                return Content("Add to cart was not successful");


        }

现在我遇到的主要问题是表单是用错误的动作呈现的。这是在html中呈现的内容。

Rendered html of the markup

现在我不知道在MVC中执行此操作的正确方法是什么,因为我对框架不熟悉,但我想避免在javascript中进行AJAX调用(如果有的话)更好的方法。我不确定在dom上行动不正确的事故原因是什么。我怀疑它与我的route.config文件有关,好像我改变了文件中的顺序或路由,它们对操作的结果有影响。如果有相关内容,我可以在更新中发布此内容,但我想我会将此问题归结为Stack Overflow专业知识。谢谢。

1 个答案:

答案 0 :(得分:2)

您使用了错误的重载,其中第二个参数是路由值,这就是您获得....?Length=5的原因(string有一个名为Length的属性,并且&#中有5个字符39;推车&#39;)。使用this overload(并删除不必要的Url选项)

@using (Ajax.BeginForm("AddToCart", "Carts", new { product_ID = Model.Product_ID }, 
    new AjaxOptions { OnSuccess="OnSuccess", HttpMethod="Post" }, 
    new { @style = "display:inline-block"}))
{
    <input type="submit" class="button round large primary" value="Add To Cart" />
}

另请注意,您不需要Product_ID的隐藏输入,因为它已被添加为路由/查询字符串值。

另请注意,默认HttpMethod"Post",因此无需添加该选项。