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

问题描述 投票:0回答:2

System.Threading.Tasks.Task 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()
    {

    }
}
c# razor asp.net-core razor-pages
2个回答
10
投票

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

参考ASP.NET Core 中的 Razor 页面简介


4
投票

对于使用

dotnet watch run
的用户,请尝试重新启动应用程序(终端中的 Ctrl+R)。

我在重大代码更改后发生过这种情况。我的代码有一个匹配的处理程序,但 .NET 在重新启动之前认为有多个处理程序。

© www.soinside.com 2019 - 2024. All rights reserved.