如何在不使用Ajax / JQuery的情况下将Quantity从View传递给Controller

时间:2015-11-28 17:04:19

标签: asp.net-mvc

我一直试图将数量传递给我的控制器,但无法弄清楚如何。我是新手,需要一些帮助!我知道我需要创建一个ActionResult UpdateCart(int BookID,int quantity),但不知道需要做什么。

这是我的观看代码:

@{
    ViewBag.Title = "Cart";
}
@using FinalProject_Lio_Lopez_Jafri_Wood.Controllers;
@model ShoppingCartItem



<h2>Cart</h2>
<table class="table table-hover">
    <tr>

        <th>Book Title</th>
        <th>Book Unique Nnmber</th>
        <th>Book Price</th>
        <th>Quantity</th>
        <th>Option</th>
        <th>Sub Total</th>
    </tr>
    @{decimal s = 0;}
    @foreach (ShoppingCartItem item in (List<ShoppingCartItem>)Session["cart"])
    {
        s += item.Books1.BookPrice * item.Quantity;
        <tr>

            <td>@item.Books1.BookTitle</td>
            <td>@item.Books1.BookUniqueNumber</td>
            <td>$ @item.Books1.BookPrice</td>
            <td>@Html.TextBoxFor(m => m.Quantity, new { @Value = "1", @class = "form-control" , style="width:50px;" })</td>
            <td>
                @Html.ActionLink("Refresh Quantity", "Update", "ShoppingCart", new{id = item.Books1.BookID, quantity = item.Quantity}) | @Html.ActionLink("Remove Item", "Delete", "ShoppingCart",
            new { id = item.Books1.BookID }, null)
            </td>
            <td>$ @(item.Books1.BookPrice * item.Quantity)</td>
        </tr>
    }
    <tr>
        <td align="right" colspan="5">TOTAL</td>
        <td>$ @s</td>
    </tr>
</table>
<br />
@Html.ActionLink("Continue Shopping", "Search", "Books")
<input type="button" value="Check Out" class="btn-info btn-active" style="float: right" />

到目前为止,这是我的控制器代码:

public class ShoppingCartController : Controller
    {
        private ApplicationDbContext db = new ApplicationDbContext(); 



        public ActionResult Index()
        {
            return View();
        }

        private int isExisting(int id)
        {
            List<ShoppingCartItem> cart = (List<ShoppingCartItem>) Session["cart"];
            for (int i = 0; i < cart.Count; i++ )
                if(cart[i].Books1.BookID==id)
                    return i;
            return -1;
        }






        public ActionResult Delete(int id)
        {
            int index = isExisting(id);
            List<ShoppingCartItem> cart = (List<ShoppingCartItem>)Session["cart"];
            cart.RemoveAt(index);
            Session["cart"] = cart;
            return View("Cart");
        }




      public ActionResult UpdateCart(int BookID, int quantity)
       {
         return View("Cart");
        }


        public ActionResult AddToCart(int id)
        {
            if (Session["cart"] == null)
            {
                List<ShoppingCartItem> cart = new List<ShoppingCartItem>();
                cart.Add(new ShoppingCartItem(db.Books.Find(id), 1));
                Session["cart"] = cart;

            }
            else
            {
                List<ShoppingCartItem> cart = (List<ShoppingCartItem>) Session["cart"];
                int index = isExisting(id);
                if (index == -1)
                    cart.Add(new ShoppingCartItem(db.Books.Find(id), 1));
                else
                    cart[index].Quantity++;

                Session["cart"] = cart;
            }
            return View("Cart");
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您似乎遇到了一些语法问题。我建议你使用resharper,它应该至少包含这样的语法错误。

  1. 您的控制器和视图中有不同的操作名称。 MVC还不够智能,无法确定“更新”和“UpdateCard”是一回事。

  2. 您还有另一个命名问题。如果您希望参数是URL的一部分并且不更改路由,则默认MVC路由约定是使用id。这是可配置的,但默认是。

  3. 检查ActionLink的参数。您应该已指定路由参数,但似乎您指定了html属性。检查Html.ActionLink的声明。请注意,确保始终可以使用命名参数。

  4. 绝不能使用GET进行更新(就像你一样),因为这会引发不必要的或随机的更新。想象一下,例如搜索引擎(谷歌)索引您的网站 - 它将“点击”您的链接(导航到该),这将添加商品到购物车。不好。我建议你在asp.net mvc上查看一些入门课程......

  5. 无论如何,为了解决问题,请尝试:

    控制器:

    public ActionResult UpdateCart(int id, int quantity)
    {
        return View("Cart");
    }
    

    查看:

    @Html.ActionLink("Refresh Quantity", "UpdateCart", "ShoppingCart", 
        new { id = item.Books1.BookID, quantity = item.Quantity}, null)