【问题标题】:Inherited razor page OnPostAsync - Multiple handlers matched继承的剃须刀页面 OnPostAsync - 匹配多个处理程序
【发布时间】:2019-12-29 09:03:13
【问题描述】:

当我从另一个继承剃须刀页面时,我的新测试项目遇到了问题。 所以我有一个编辑器页面,我想使用相同的流程,只是给了一个额外的参数(id),代码是:

public class EditModel : BaseModel
{
    public EditModel() 
    {
    }

    public Task<IActionResult> OnPostAsync(int id)
    {
        ...
    }
}

public class CreateModel : EditModel
{
    public CreateModel()
    {

    }

    public Task<IActionResult> OnPostAsync()
    {
        ...
    }
}

我还将编辑器 cshtml 定义为:

@page "{id:int}"
...

并将cshtml创建为:

@page
...

我希望路由很明显因为编辑器的参数不是可选的,但是创建不需要参数,但是我得到了错误:

多个处理程序匹配

如果我也在创建页面模型中定义参数,它开始使用 0 值。

对此我有两个问题:

我可以定义一个路由模板,我可以明确禁止参数(以及如何)以避免歧义吗?(现在我使用默认路由模板。)

我应该避免这种剃须刀页面的继承吗?我可以,除非这是设计使然,并使用其他方式来做到这一点。

我想提一下,我知道我可以定义另一个不同于默认 onget/onpost/etc 的处理程序方法并以这种方式使用它,但是我认为如果我能以一种好的方式定义路由,上述问题应该可以正常工作.

【问题讨论】:

    标签: c# asp.net asp.net-routing asp.net-core-3.1


    【解决方案1】:

    您好,欢迎来到董事会!在深入了解此设计的目的之前,让我们先弄清楚场景。

    • 您可能正在使用 ASP.NET Core Razor 页面,但您最终得到了这一行 EditModel : BaseModel,所以我认为一定有类似 BaseModel : PageModel 的内容
    • 接下来我知道你进行了另一个继承,即CreateModel : EditModel,这一次它把我搞砸了,因为这显然会使 EditModel 继承一个所谓的方法Task&lt;IActionResult&gt; OnPostAsync(int id),因为继承是做什么的!

    例如:

    public class Test1
    {
        public void sayHello(){
            Console.WriteLine("hehe");
        }
    }
    
    public class Test2 : Test1
    {
        public void sayHello(string inputValue){
            Console.WriteLine(inputValue);
        }
    }
    

    当你有类似的东西时的结果

    Test2 test = new Test2();
    test.sayHello();
    test.sayHello("something");
    

    结果是

    hehe
    something
    

    再一次,我不确定你对这种方法的目的,所以如果你能分享一些的话会很好,这样我们都可以在新的东西上发展。

    更新: 在这一点上,我了解到您为案例研究创建了一个问题。所以让我们看看我是否想出了正确的方法。

    .NET core 允许您在默认路由旁边定义Startup.cs 内的一些特定路由,这显然不适合这种情况。

    public void ConfigureServices(IServiceCollection services)
    {
        services
            .AddMvc()
            .AddRazorPagesOptions(options =>
            {
                options.Conventions.AddPageRoute("/edit", "{handler?}/{id?}");
                options.Conventions.AddPageRoute("/create", "{handler?}");
            });
    }
    

    现在,我相信如果您将@page "{id:int}" 放入您的.cshtml 页面,它会按预期运行。

    【讨论】:

    • 您的示例非常好,因为-我认为-pagemodel 继承应该以相同的方式工作。因此,如果我们继续使用您的示例,当前行为是当您调用 test.sayHello(); 时,您会收到错误 多个处理程序匹配。当我调用 Post 方法时,就会发生这种情况。编辑:这就是为什么我认为路由有问题,因为我希望与您的示例相同!
    • 我刚刚更新了我的答案,请看一下。我希望这会有所帮助:) 和Happy New Year btw。
    • 感谢您的照顾,也祝您新年快乐!我对此不满意,但我不得不说你的解决方案给出了相同的结果:InvalidOperationException: Multiple handlers matched. The following handlers matched route data and had all constraints satisfied: System.Threading.Tasks.Task1[Microsoft.AspNetCore.Mvc.IActionResult] OnPostAsync(), System.Threading.Tasks.Task1[Microsoft.AspNetCore.Mvc.IActionResult] OnPostAsync(Int32)
    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 2019-08-13
    • 2021-06-29
    • 2019-03-18
    • 2020-05-30
    • 2021-04-05
    • 2019-02-02
    • 1970-01-01
    相关资源
    最近更新 更多