InvalidOperationException:多个处理程序匹配。以下处理程序匹配了路线数据并满足所有约束条件:

时间:2018-07-05 09:31:37

标签: 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剃须刀主页面。

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()
    {

    }
}

1 个答案:

答案 0 :(得分:7)

剃刀页面使用基于约定的处理程序进行导航。

当前的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");
    }   
}

引用Introduction to Razor Pages in ASP.NET Core