В настоящее время я работаю над созданием простой корзины покупок, в которой отображаются позиции на основе обращения к таблице. Прежде всего, я использую преимущества базового CRUD здесь, поэтому я читаю таблицу, отфильтровываю userID и проверяю, был ли назначен orderID или нет (чтобы избежать повторного отображения заказанных товаров в корзине).
Все хорошо, все работает, но по эстетическим соображениям я хотел бы рассмотреть случаи, когда один и тот же продукт (тот же ProductID, то же ProductName, но то есть другое количество) суммируется в одной позиции (количество заказа A + количество заказа B, и т. д.) вместо нескольких позиций с разным количеством.
Примечание: я предлагаю подписки, а также отдельные заказы (в зависимости от логического значения в таблице), поэтому, пожалуйста, не позволяйте этому раздражать.
Модель для LineItems выглядит следующим образом:
public class LineItems
{
public int ID { get; set; }
public string UserID { get; set; }
public int ProductID { get; set; }
public string ProductName { get; set; }
//[Range(1, int.MaxValue, ErrorMessage = "Naja... Menge 0 lohnt sich nicht zu liefern...")]
public int SubscriptionQuantity { get; set; }
public string SubscriptionCadenceCategory { get; set; }
public int SubscriptionCadenceValue { get; set; }
public decimal SubscriptionPrice { get; set; }
public bool IsSingleOrder { get; set; }
//[Range(1, int.MaxValue, ErrorMessage = "Naja... Menge 0 lohnt sich nicht zu liefern...")]
public int SingleOrderQuantity { get; set; }
public decimal SingleOrderPrice { get; set; }
public decimal TotalPrice { get; set; }
public int OrderNumber { get; set; }
public DateTime UpdatedTimeStampUTC { get; set; }
public string UpdatedLatitude { get; set; }
public string UpdatedLongitude { get; set; }
public string UpdatedLocation { get; set; }
}
и просмотр:
<div id="shoppingCart" class="productTableSection row">
@foreach (var item in Model)
{
if (item.IsSingleOrder == false)
{
<div id="shoppingCartSubscriptionLineItemArea" class=" tableArea col-xs-offset-1 col-xs-10 col-sm-offset-1 col-sm-10 col-md-offset-1 col-md-10 col-lg-offset-2 col-lg-8">
@Html.HiddenFor(modelItem => item.ID, new { @class = "tableField col-xs-12 col-sm-12 col-md-12 col-lg-12" })
<a id="shoppingCartSubscriptionRemoveLink" class="tableField col-xs-1 col-sm-1 col-md-1 col-lg-1" href="#">
<i id="shoppingCartSubscriptionRemove" class="fas fa-trash-alt"></i>
</a>
<a id="shoppingCartSubscriptionLineItemLink" class="tableField col-xs-10 col-sm-10 col-md-10 col-lg-10" href="@Url.Action("ProductSubscription", "freshNclean", new { id = item.ID })">
<div id="shoppingCartSubscriptionProductNameField" class="tableField col-xs-7 col-sm-8 col-md-9 col-lg-9">
@Html.DisplayFor(modelItem => item.ProductName)
</div>
<div id="shoppingCartSubscriptionProductPriceField" class="tableField col-xs-5 col-sm-4 col-md-3 col-lg-3">
CHF @Html.DisplayFor(modelItem => item.SubscriptionPrice)
</div>
<div id="shoppingCartSubscriptionProductQuantityField" class="tableField col-xs-4 col-sm-4 col-md-5 col-lg-5">
@Html.DisplayFor(modelItem => item.SubscriptionQuantity) x
</div>
<div id="shoppingCartSubscriptionCadenceValueField" class="tableField col-xs-3 col-sm-2 col-md-2 col-lg-1">
alle @Html.DisplayFor(modelItem => item.SubscriptionCadenceValue)
</div>
<div id="shoppingCartSubscriptionCadenceCategoryField" class="tableField col-xs-5 col-sm-6 col-md-5 col-lg-6">
@Html.DisplayFor(modelItem => item.SubscriptionCadenceCategory)
</div>
<div id="shoppingCartSubscriptionTotalPriceField" class="tableField col-xs-12 col-sm-12 col-md-12 col-lg-12">
CHF @Html.DisplayFor(modelItem => item.TotalPrice)
</div>
</a>
<a id="shoppingCartSubscriptionEditLink" class="tableField col-xs-1 col-sm-1 col-md-1 col-lg-1" href="#">
<i id="shoppingCartSubscriptionEdit" class="fas fa-edit"></i>
</a>
</div>
}
else
{
<div id="shoppingCartSingleOrderLineItemArea" class=" tableArea col-xs-offset-1 col-xs-10 col-sm-offset-1 col-sm-10 col-md-offset-1 col-md-10 col-lg-offset-2 col-lg-8">
@Html.HiddenFor(modelItem => item.ID, new { @class = "tableField col-xs-12 col-sm-12 col-md-12 col-lg-12" })
<a id="shoppingCartSingleOrderRemoveLink" class="tableField col-xs-1 col-sm-1 col-md-1 col-lg-1" href="#">
<i id="shoppingCartSingleOrderRemove" class="fas fa-trash-alt"></i>
</a>
<a id="shoppingCartSingleOrderLineItemLink" class="tableField col-xs-10 col-sm-10 col-md-10 col-lg-10" href="@Url.Action("ProductSingleOrder", "freshNclean", new { id = item.ID })">
<div id="shoppingCartSingleOrderProductNameField" class="tableField col-xs-7 col-sm-8 col-md-9 col-lg-9">
@Html.DisplayFor(modelItem => item.ProductName)
</div>
<div id="shoppingCartSingleOrderProductPriceField" class="tableField col-xs-5 col-sm-4 col-md-3 col-lg-3">
CHF @Html.DisplayFor(modelItem => item.SingleOrderPrice)
</div>
<div id="shoppingCartSingleOrderProductQuantityField" class="tableField col-xs-12 col-sm-12 col-md-12 col-lg-12">
@Html.DisplayFor(modelItem => item.SingleOrderQuantity) x
</div>
<div id="shoppingCartSingleOrderTotalPriceField" class="tableField col-xs-12 col-sm-12 col-md-12 col-lg-12">
CHF @Html.DisplayFor(modelItem => item.TotalPrice)
</div>
</a>
<a id="shoppingCartSingleOrderEditLink" class="tableField col-xs-1 col-sm-1 col-md-1 col-lg-1" href="#">
<i id="shoppingCartSingleOrderEdit" class="fas fa-edit"></i>
</a>
</div>
}
}
</div>
наконец Контроллер:
// GET: /freshNclean/ShoppingCart
[Authorize]
public ActionResult ShoppingCart(Orders model)
{
// define variables
var userID = User.Identity.GetUserId();
DateTime nowUTC = DateTime.Now.ToUniversalTime();
DateTime nowLocal = DateTime.Now.ToLocalTime();
// track user activity: get method is restricted to activity name and timestamp
var LOADED = new UserActivities
{
UserID = userID,
ActivityName = "ShoppingCart_Loaded",
ActivityTimeStampUTC = nowUTC,
ActivityLatitude = "n/a",
ActivityLongitude = "n/a",
ActivityLocation = "n/a"
};
DATADB.UserActivityList.Add(LOADED);
DATADB.SaveChanges();
return View(DATADB.LineItemList.Where(x => x.UserID == userID).Where(x => x.OrderNumber == 0).ToList());
}