我需要在HeaderLinks partial之外显示购物车,该购物车将购物车物品从CommonController.HeaderLinks动作传递的模型中取出。通过创建一个带有传递购物车信息的操作的新控制器,我能够从我们的模板中获取自定义ui元素。现在,控制器在一个自定义插件中,我得到了其他一些东西。我看到它的方式我有两个选择:
将控制器留在插件项目中,并考虑到如果由于某种原因没有安装插件(即从新开发人员那里重新结账),主题将会中断,可能会重定向用户到错误视图。
将控制器放在Nop.Web的Controllers文件夹中,其缺点是这将为升级NopCommerce的过程增加额外的一步。如果出现类似的问题,这可能会很快变得丑陋。
所以我的问题是:放置控制器的最佳位置在哪里?或者有更简单的方法用购物车做这件事吗?
此致 何
答案 0 :(得分:2)
我将告诉你解决它的捷径。首先创建一个部分(剃刀)视图,例如_CustomPartialView
,然后在局部视图内部的顶部添加这些使用
@using Nop.Core;
@using Nop.Core.Infrastructure;
@using Nop.Services.Orders;
然后接下来是查询购物车这很容易因为nopCommerce已经静态访问依赖解析器方法,即EngineContext.Current.Resolve<T>()
。在您的情况下(对于购物车),它可能是以下;
@{
var shoppingCartEnabled = EngineContext.Current.Resolve<Nop.Services.Security.IPermissionService>()
.Authorize(Nop.Services.Security.StandardPermissionProvider.EnableShoppingCart);
var customer = EngineContext.Current.Resolve<IWorkContext>().CurrentCustomer;
int shoppingCartItems = 0;
if (customer.HasShoppingCartItems)
{
shoppingCartItems = customer.ShoppingCartItems
.Where(sci => sci.ShoppingCartType == Nop.Core.Domain.Orders.ShoppingCartType.ShoppingCart)
.LimitPerStore(EngineContext.Current.Resolve<IStoreContext>().CurrentStore.Id)
.ToList()
.GetTotalProducts();
}
if (shoppingCartEnabled)
{
<div class="header-right pull-right wrap-cart hidden-xs ">
<div class="cart-top pull-right">
<div id="cart">
<span class="icon fa fa-shopping-cart"></span>
<div class="heading">
<a href="@Url.RouteUrl("ShoppingCart")" class="ico-cart dropdown-toggle visible-md visible-lg" data-toggle="dropdown" data-hover="dropdown">
<h4 class="cart-label">
@T("ShoppingCart")
<span>@T("ShoppingCart.HeaderQuantity", shoppingCartItems)</span>
</h4>
</a>
</div>
<div class="content">
@if (!String.IsNullOrWhiteSpace(Html.Action("FlyoutShoppingCart", "ShoppingCart").ToString()))
{
<li>@Html.Action("FlyoutShoppingCart", "ShoppingCart")</li>
}
</div>
</div>
</div>
</div>
}
}
如果您需要更多帮助,请告诉我们。)