InvalidOperationException:匹配多个处理程序.以下处理程序匹配路由数据并满足所有约束:

Bor*_*ris 3 c# razor asp.net-core razor-pages

System.Threading.Tasks.Task OnGetAsync(),Void OnGet()

OnGetAsync(),Void OnGet()我在Microsoft Visual Studio 2017中构建.NET Core 2.1应用程序时收到此错误.这是我认为其中包含错误的视图.它是主要的index.cshtml razor页面.

public class IndexModel : PageModel
{
    private readonly AppDbContext _db;

    public IndexModel(AppDbContext db)
    {
        _db = db;
    }

    public IList<Customer> Customers { get; private set; }

    public async Task OnGetAsync()
    {
        Customers = await _db.Customers.AsNoTracking().ToListAsync();
    }

    public async Task<IActionResult> OnPostDeleteAsync(int id)
    {
        var contact = await _db.Customers.FindAsync(id);

        if (contact != null)
        {
            _db.Customers.Remove(contact);
            await _db.SaveChangesAsync();
        }

        return RedirectToPage();
    }

    public void OnGet()
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

Nko*_*osi 7

Razor页面使用基于约定的处理程序进行导航.

当前的PageModel有两个Get处理程序Tasks.Task OnGetAsync(),并且Void OnGet()在异常中有明确说明.

框架无法确定使用哪一个.

删除void OnGet看似未使用的内容.

建议检查命名,OnPostDeleteAsync因为这也可能导致路由问题.

您可以为任何HTTP谓词添加处理程序方法.最常见的处理程序是:

  • OnGet初始化页面所需的状态.OnGet示例.
  • OnPost 处理表单提交.

Async命名后缀是可选的,但往往是异步函数使用的约定.

public class IndexModel : PageModel {
    private readonly AppDbContext _db;

    public IndexModel(AppDbContext db) {
        _db = db;
    }

    public IList<Customer> Customers { get; private set; }

    public async Task<IActionResult> OnGetAsync() {
        Customers = await _db.Customers.AsNoTracking().ToListAsync();
        return Page();
    }

    public async Task<IActionResult> OnPostAsync(int id) {
        var contact = await _db.Customers.FindAsync(id);

        if (contact != null) {
            _db.Customers.Remove(contact);
            await _db.SaveChangesAsync();
        }    
        return RedirectToPage("/Index");
    }   
}
Run Code Online (Sandbox Code Playgroud)

ASP.NET核心中Razor页面的参考介绍