当我从另一个测试项目继承剃须刀片页面时,我的新测试项目遇到了问题。 所以我有一个编辑器页面,我想使用相同的流程,只是给出了一个额外的参数(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
页面,它将按预期运行。