首页 > 解决方案 > await _context 中的错误:“无法通过表达式引用类型”

问题描述

基于这个答案

我已经像这样编辑了我的 .cs:

private readonly GroupAccessDetailsModel _context;
public GroupAccessDetailsModel(GroupAccessDetailsModel context)
{
    _context = context;
}
[BindProperty]
public IList<OutputAccessRights> UsersAccessRights { get; set; }

public async Task<IActionResult> OnGetAsync()
{
    UsersAccessRights = await _context.OutputAccessRights.ToListAsync();

    if (UsersAccessRights == null)
    {
        return NotFound();
    }
    return Page();
}

模型:

 public class OutputAccessRights
{
    public int Id { get; set; }
    public bool ChkUserAccessRights { get; set; }
    public string SubMenuDescription { get; set; }
    public string MainMenuDescription { get; set; }
    public bool ChkAddRight { get; set; }
}

但我的问题在于 await _context。输出访问权限 .ToListAsync ()。

错误:无法通过表达式引用类型

我试过用 await _context.GroupAccessDetailsModel.OutputAccessRights.ToListAsync(); 替换它 但它没有用。知道如何解决这个问题吗?

标签: asp.net-coreasync-awaitrazor-pages

解决方案


错误:无法通过表达式引用类型。

那是因为您使用模型而不是使用 DbContext。

您首先需要学习如何使用Entity Framework Core

然后,您可以按照关于Razor Pages with Entity Framework Core的教程进行操作

方法中的以下代码OnGet用于显示所有OutputAccessRights数据。

UsersAccessRights = await _context.OutputAccessRights.ToListAsync();

上一个线程的问题是无法传递选择复选框列表。这意味着您可以显示数据,但无法将选择复选框传递给OnPost

我所做的Edit.cshtml.cs是测试该OnPost方法是否可以获取列表复选框。无需关心我如何设置方法,只需OutputAccessRightsOnGet方法上使用您之前的代码即可OnGet

以下是有关如何使用 EF Core 的完整代码:

1.DbContext(_context.OutputAccessRights来自这里):

public class RazorContext : DbContext
{
    public RazorContext (DbContextOptions<RazorContext> options)
        : base(options)
    {
    }
    public DbSet<OutputAccessRights> OutputAccessRights { get; set; }
}

2.appSettings.json(这里我使用visual studio中默认的sql server):

"ConnectionStrings": {
   "ConnectionName": "Server=(localdb)\\mssqllocaldb;Database=DatabaseName;Trusted_Connection=True;MultipleActiveResultSets=true"
 }

3.启动.cs:

public void ConfigureServices(IServiceCollection services)
{ 
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddDbContext<RazorContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("ConnectionName")));
}

4.在包 Nuget 管理器上运行命令行:

PM>add-migration init
PM>update-database

5.然后你可以设置数据:

public class EditModel : PageModel
{
    private readonly RazorContext _context;

    public EditModel(RazorContext context)
    {
        _context = context;
    }

    [BindProperty]
    public IList<OutputAccessRights> UsersAccessRights { get; set; }

    public async Task<IActionResult> OnGetAsync()
    {
        UsersAccessRights = await _context.OutputAccessRights.ToListAsync();//set the data to UsersAccessRights
        return Page();
    }


    public async Task<IActionResult> OnPostAsync(IList<OutputAccessRights> usersAccessRights)
    {
        //do your stuff...
    }
}

推荐阅读