c# - 从 View 组件中获取 session ID

标签 c# session asp.net-core asp.net-core-viewcomponent

这段代码可以很好地从 Controller 中获取 session ID:

HttpContext.Session.SetString("_Name", "MyStore");
string SessionId = HttpContext.Session.Id;

...但是当我尝试将相同的代码放入 View 组件类时,VS 告诉我名称 HttpContext.Session.SetString(或只是 HttpContext.Session,或者只是 HttpContext) 在当前上下文中不存在。我在类(class)顶部有 using Microsoft.AspNetCore.Http;

编辑

这是我的 View 组件类:

public class ShoppingCartViewComponent : ViewComponent
{
    private readonly MyStoreContext _context;

    public ShoppingCartViewComponent(MyStoreContext context)
    {
        _context = context;
    }

    // Initialize session to enable SessionId
    // THIS WON'T WORK:
    HttpContext.Session.SetString("_Name", "MyStore");
    string SessionId = HttpContext.Session.Id;

    public async Task<IViewComponentResult> InvokeAsync(int Id)
    {
        var cart = await GetCartAsync(Id);
        return View(cart);
    }

    private async Task<ViewModelShoppingCart> GetCartAsync(int Id)
    {
        var VMCart = await _context.ShoppingCarts
                    .Where(c => c.Id == Id)
                    .Select(cart => new ViewModelShoppingCart
                    {
                        Id = cart.Id,
                        Title = cart.Title,
                        CreateDate = cart.CreateDate,
                        ShoppingCartItems = cart.ShoppingCartItems
                                            .Select(items => new ViewModelShoppingCartItem
                                            {
                                                ProductId = items.ProductId,
                                                ProductTitle = items.Product.Title,
                                                ProductPrice = items.Product.Price,
                                                Quantity = items.Quantity
                                            }).ToList()
                    }).FirstOrDefaultAsync();
        return VMCart;
    }
}

最佳答案

问题是您正在尝试访问存在于 HttpContext 实例上的方法,而不是静态方法。最简单的方法是让依赖注入(inject)框架给你一个IHttpContextAccessor。例如:

public class ShoppingCartViewComponent : ViewComponent
{
    private readonly IHttpContextAccessor _contextAccessor;
    private readonly MyStoreContext _context;

    public ShoppingCartViewComponent(MyStoreContext context,
        IHttpContextAccessor contextAccessor)
    {
        _context = context;
        _contextAccessor = contextAccessor;

        _contextAccessor.HttpContext.Session.SetString("_Name", "MyStore");
        string SessionId = _contextAccessor.HttpContext.Session.Id;
    }

    //snip rest of code for brevity    
}

关于c# - 从 View 组件中获取 session ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48368553/

相关文章:

c# - 使用 C# 的跨平台开源异步 HTTP 和 DB

c# - 为什么非静态方法可以访问静态字段?

在代理之外访问 Apache Tomcat 应用程序的 session 问题

node.js - 服务器重新启动时如何在 Node js 中保持持久 session ?

c# - .NET Core 中的 WebUtility.HtmlDecode 替换

c# - 如何检查列是否可以转换为 double ? (DataTable.Column.DataType)

c# - 返回查询中的最大值

web-services - Tomcat 在调用 session.invalidate() 后不会使 session 无效

c# - asp.net core (mvc) ViewModel请求主键

asp.net-core - 系统.DllNotFoundException : Unable to load DLL 'libuv'