c# - 在 View 上自动更新 ViewComponent

标签 c# html razor asp.net-core-mvc asp.net-core-viewcomponent

我目前有这个看法:

Cart

但是每当我向购物车添加东西时,它都不会自动更新计数。仅当我刷新页面时。

我怎样才能让它自动更新?它在 _Layout View 上带有一个 View 组件。

购物车 View 组件

public class CartViewComponent : ViewComponent
    {
        private readonly ApplicationDbContext _context;
        private readonly SignInManager<UserModel> _signInManager;
        private readonly UserManager<UserModel> _userManager;

        public CartViewComponent(
            ApplicationDbContext context, 
            SignInManager<UserModel> signInManager, 
            UserManager<UserModel> userManager)
        {
            _context = context;
            _signInManager = signInManager;
            _userManager = userManager;
        }

        public int CheckIfOrderExists()
        {
            var userId = Request.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);

            OrderMain orderMain = _context.OrderMains.Where(o => o.user_id == userId).FirstOrDefault();
            if (orderMain != null)
            {
                return orderMain.id;
            }
            else
            {
                return 0;
            }

        }

        public int CountItemsInShoppingCart(int order_id)
        {
            var result = (from orderlines in _context.OrderLines
                          join items in _context.Items on orderlines.item_id equals items.id
                          join ordermains in _context.OrderMains on orderlines.order_id equals ordermains.id
                          where orderlines.order_id == order_id
                          select orderlines).Count();

            return result;
        }

        public IViewComponentResult Invoke()
        {
            int order_id = CheckIfOrderExists();
            int count = CountItemsInShoppingCart(order_id);
            ViewBag.count = count;

            return View(ViewBag.count);
        }
    }

Default.cshtml
<span class="badge">@ViewBag.count</span>

_Layout.cshtml
...
<li>
    <a asp-area="" asp-controller="ShoppingCart" asp-action="Index">
        <span style="color:black;" class="glyphicon glyphicon-shopping-cart"></span>
        @await Component.InvokeAsync("Cart")
    </a>
</li>
...

最佳答案

这里有一个服务器端和客户端组件。首先, View 组件只是服务器端的东西。一旦它被渲染并且服务器将响应返回给客户端,它是一个 View 组件的事实就完全无关紧要了。客户端的所有内容都是 DOM 中的节点集合。

在客户端,如果您只想使用来自服务器的新信息更新页面的某些部分,则需要发出 AJAX 请求。这背后的 JavaScript 对象,XMLHttpRequest , 就是您所说的“瘦客户端”。它只是发出请求并接收响应,但它不会自行执行任何操作,例如渲染、向 DOM 添加内容等。这取决于您作为开发人员如何处理来自服务器的响应以及如何处理它。

在这方面,您有几个选择。首先,您可以让服务器返回带有一些 HTML 的部分内容。您不能直接请求或返回您的 View 组件,因此您需要一个返回 PartialView 的操作。 ,以及调用您的 View 组件的相应部分 View :

public IActionResult GetCart() =>
    PartialView("_Cart");

然后,在 _Cart.cshtml :
@await Component.InvokeAsync("Cart");

然后,在对 AJAX 请求的回调中,您将选择页面上现有的“Cart”父元素,并将其替换为从服务器返回的新 HTML。

第二个选项是简单地使用一个端点,将当前购物车项目计数作为 JSON 返回。例如:
{
    "items": 3
}

然后,在你的 AJAX 回调中,你可以用这个数字替换徽章的文本。

关于c# - 在 View 上自动更新 ViewComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53482749/

相关文章:

c# - Razor C# - 从数据库中获取数据

asp.net - 中止/跳过/取消 Razor View 的渲染

javascript - JavaScript 中的 Razor

c# - 如何识别列表中的任何项目是否作为另一个对象列表的元素存在

html - 如何像附图一样塑造导航菜单中的事件列表?

html - 将绝对元素居中,直到没有 js 的范围

html - <hr> 中间有一个向下箭头的线

c# - 从线程访问和更改 winform webbrowser

c# - 派生类中属性的可见性 (C#)

c# - 发生错误时从Entity Framework中删除一批记录