【问题标题】:Ajax.Begin form not rendering correct action .NET mvc4Ajax.Begin 表单未呈现正确的操作.NET mvc4
【发布时间】:2016-08-29 22:56:12
【问题描述】:

我的 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 中呈现的内容。

现在我不知道在 MVC 中执行此操作的正确方法是什么,因为我对框架有点陌生,但如果有更好的方法,我想避免在 javascript 中进行 AJAX 调用。我不确定 dom 上的操作不正确导致事故的原因是什么。我怀疑它与我的 route.config 文件有关,就好像我更改了文件中的顺序或路由一样,它们会对操作的结果产生影响。如果相关,我可以在更新中发布它,但我想我会把它扔给 Stack Overflow 专家。谢谢。

【问题讨论】:

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


    【解决方案1】:

    您使用了错误的重载,其中第二个参数是路由值,这就是您得到 ....?Length=5 的原因(string 有一个名为 Length 的属性,并且 'Carts' 中有 5 个字符)。使用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",因此不需要添加该选项。

    【讨论】:

    • 另外,如果您想显示这个 ajax 表单提交的结果,您可能需要指定 UpdateTargetId 属性(在 AjaxOptions 中)。
    • 它目前在 html 中呈现产品 ID。这会带来安全问题吗? /Carts/AddToCart?product_ID=1 是渲染出来的,我觉得在 html 中输出数据库实体的 ID 是不安全的。对这个主题有什么想法吗?
    • 不应该是(您通常在进行 GET 调用时将 ID 添加为路由值 - 例如 /Products/Edit/1,但如果您担心,则将 new { product_ID = Model.Product_ID } 替换为 null 和重新添加隐藏的输入。
    • 还要注意 Shyju 的评论 - 您可以添加(比如)UpdateTargetId="message" 选项并在视图中添加 &lt;div id="message"&gt;&lt;/div&gt; 以显示您返回的内容(尽管这可能是您的 OnSuccess 函数已经在做的事情?)
    • AJAX UpdateTargetId 选项似乎不起作用。也不会让我的 onSuccess 函数受到打击。我是否从控制器返回错误的返回值?我正在传递 Content("string in here") 返回值,它只是将我带到另一个页面。我需要做什么才能让它发挥作用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    相关资源
    最近更新 更多