继承的剃须刀片页面 OnPostAsynC语言 匹配多个处理程序



当我从另一个测试项目继承剃须刀片页面时,我的新测试项目遇到了问题。 所以我有一个编辑器页面,我想使用相同的流程,只是给出了一个额外的参数(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 的处理程序方法并以这种方式使用它,但是我认为如果我能以良好的方式定义路由,上述问题应该可以正常工作。

您好,欢迎来到董事会!在深入挖掘此设计的目的之前,让我们首先明确一下场景。

  • 您可能正在使用 ASP.NET 核心剃刀页面,但您最终得到了这一行EditModel : BaseModel所以我认为一定有类似BaseModel : PageModel
  • 接下来我知道你做了另一个CreateModel : EditModel的继承,这次它让我烦恼了,因为这显然会使 EditModel 继承一个所谓的Task<IActionResult> 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页面,它将按预期运行。

相关内容

最新更新