【发布时间】:2016-12-11 07:11:42
【问题描述】:
我正在使用 asp.net mvc 开发购物车。我已经完成了购物车的完整功能,用户可以通过文本框删除产品或更新其数量。但我不喜欢购物车中每个产品右侧有 2 个额外链接的部分(更新数量和删除产品)。我可以删除产品链接,因为每个产品都有删除链接是有意义的。现在我只想拥有一个名为保存更改的按钮或链接。单击该按钮/链接时,我想从每个数量文本框中收集值,将其传递给控制器并执行其需要完成的操作并从控制器作为 json 对象返回。问题是我到目前为止只使用了几天的ajax,并且不知道如何从我的视图中的文本框中迭代/收集值并将它们发送到控制器。
这是我的看法
@model OnlineShop.ViewModels.ShopingCartViewModel
....
<p class="button">
@Html.ActionLink("Checkout >>", "AddressAndPayment", "Checkout")
</p>
<table class="table-bordered">
<tr>
headers
</tr>
@for (int i = 0; i < Model.CartItems.Count; i++)
{
<tr id="row-@Model.CartItems[i].RecordID">
<td>
<img src="@Url.Content(Model.CartItems[i].Product.ProductImg)" class="img-responsive" style="width:60px;height:60px;padding:5px;"/>
</td>
@*need to be done later*@
<td>
@Html.ActionLink(Model.CartItems[i].Product.ProductName, "Details", "Store", new{id =Model.CartItems[i].ProductID}, null)
</td>
<td>
@Model.CartItems[i].Product.ProductPrice
</td>
<td>
@Html.TextBoxFor(model=>model.CartItems[i].CartCount,new { style="width:60px;text-align:center;"})
</td>
<td>
<a href="#" class="UpdateLink" data-id="@Model.CartItems[i].RecordID" txt-id="CartItems_@(i)__CartCount">
Update Quantity
</a> |
</td>
<td>
<a href="#" class="RemoveLink" data-id="@Model.CartItems[i].RecordID">
Remove from
cart
</a>
</td>
</tr>
}
<tr>
<td>
</td>
<td></td>
<td></td>
<td></td>
<td align="center"> <b>Total</b></td>
<td id="cart-total" align="center">
<b> @Model.CartTotal</b>
</td>
</tr>
</table>
</div>
脚本
@section scripts {
<script type="text/javascript">
$(function () {
// Document.ready -> link up remove event handler
$(".RemoveLink").click(function () {
// Get the id from the link
var recordToDelete = $(this).attr("data-id");
if (recordToDelete != '') {
// Perform the ajax post
$.post("/ShopingCart/RemoveFromCart", { "id": recordToDelete }, function (data) {
// Successful requests get here
// Update the page elements
if (data.ItemCount == 0) {
$('#row-' + data.DeleteID).fadeOut('slow');
} else {
$('#item-count-' + data.DeleteID).text(data.ItemCount);
}
$('#cart-total').text(data.CartTotal);
$('#update-message').text(data.Message);
$('#cart-status').text('Cart (' + data.CartCount + ')');
});
}
});
});
$(function () {
// Document.ready -> link up remove event handler
$(".UpdateLink").click(function () {
// Get the id from the link
var recordToUpdate = $(this).attr("data-id");
var countToUpdate=$("#" + $(this).attr("txt-id")).val();
if (recordToUpdate != '') {
// Perform the ajax post
$.post("/ShopingCart/UpdateCartQuantity", { "id": recordToUpdate, "cartCount": countToUpdate}, function (data) {
// Successful requests get here
// Update the page elements
if (data.ItemCount == 0) {
$('#row-' + data.DeleteID).fadeOut('slow');
} else {
$('#item-count-' + data.DeleteID).text(data.ItemCount);
}
$('#cart-total').text(data.CartTotal);
$('#update-message').text(data.Message);
$('#cart-status').text('Cart (' + data.CartCount + ')');
});
}
});
});
function handleUpdate() {
// Load and deserialize the returned JSON data
var json = context.get_data();
var data = Sys.Serialization.JavaScriptSerializer.deserialize(json);
// Update the page elements
if (data.ItemCount == 0) {
$('#row-' + data.DeleteID).fadeOut('slow');
} else {
$('#item-count-' + data.DeleteID).text(data.ItemCount);
}
$('#cart-total').text(data.CartTotal);
$('#update-message').text(data.Message);
$('#cart-status').text('Cart (' + data.CartCount + ')');
}
</script>
}
感谢您的辛勤工作,但这让我更加困惑:) ...我会尝试更好地解释我想要实现的目标...这是我的控制器方法
[HttpPost]
public ActionResult UpdateCartQuantity(int id , int cartCount)
{
var cart = ShopingCart.GetCart(this.HttpContext);
string productName = storeDB.Carts.Single(
item => item.RecordID == id).Product.ProductName;
Product product = storeDB.Carts.Single(
item => item.RecordID == id).Product;
int oldCount = (int)storeDB.Carts.Single(
item => item.RecordID == id).CartCount;
int itemCount = 0;
if (oldCount==cartCount)
{
itemCount = oldCount;
}
else if (cartCount>oldCount)
{
itemCount = oldCount;
int sub = cartCount-oldCount;
for (int i = 0; i < sub; i++)
{
cart.AddToCart(product);
itemCount++;
}
}
else
{
itemCount = (int)cart.UpdateCartCount(id, cartCount);
}
var results = new ShopingCartRemoveViewModel
{
Message = Server.HtmlEncode(productName) +
" has quantity updated.",
CartTotal = cart.GetTotal(),
CartCount = (int)cart.GetCount(),
ItemCount = itemCount,
DeleteID = id
};
return Json(results);
}
所以我正在查看一些教程并考虑使用<input type="text"> 字段而不是@html.TextBoxFor(model=>model.CartItems[i].CartCount) 和$ajax() 来仅发布每个<input> 的recordID 和值...我可以为一个caritem 做到这一点唯一的名称/id 或类,但考虑到我有 CartItems 列表,我需要为每个 caritem 动态创建带有 for 语句的 <input> 数量字段。因此,当用户按下保存更改按钮时,它需要从每个输入字段中读取值并使用方法 UpdateCartQuantity 以及 recordID。对我来说主要问题是如何动态处理 <input> 的类/ID,因此每个都有唯一的 id 以及如何读取/发送该 recordID 和输入值。我也编辑了我的视图,现在我有 for 语句而不是你可以看到的 foreach。
【问题讨论】:
-
你为什么不直接提交表单(你有什么理由想留在同一页面上吗?)。而且您不能使用
foreach循环为集合项生成表单控件。您需要一个for循环或自定义EditorTemplate以使 2 路模型投标工作 - 请参阅 this answer
标签: jquery asp.net ajax asp.net-mvc asp.net-mvc-3