Asp.net mvc 在Razor页面路由中组合可选处理程序和参数

Asp.net mvc 在Razor页面路由中组合可选处理程序和参数,asp.net-mvc,asp.net-core,razor,routing,razor-pages,Asp.net Mvc,Asp.net Core,Razor,Routing,Razor Pages,我有一个页面“/访问”。输出访问列表。 单击任何访问时,我需要导航到“/visions/10”,其中“10”是访问的id。 这是最简单的部分。 现在还有其他“CRUD”操作,即“创建”。我希望“/visions/create”用于创建 我现在有什么: “visions.cshtml”razor页面和模型 “Visit.cshtml”razor页面,我想同时将其用作“编辑”和“创建”页面 我尝试过为“Visit.cshtml”定制“page”指令,如下所示: @page "/visits/{han

我有一个页面“/访问”。输出访问列表。 单击任何访问时,我需要导航到“/visions/10”,其中“10”是访问的id。 这是最简单的部分。 现在还有其他“CRUD”操作,即“创建”。我希望“/visions/create”用于创建

我现在有什么:

  • “visions.cshtml”razor页面和模型
  • “Visit.cshtml”razor页面,我想同时将其用作“编辑”和“创建”页面
  • 我尝试过为“Visit.cshtml”定制“page”指令,如下所示:

    @page "/visits/{handler?}/{id?}"
    
    这就是模型:

    public class VisitModel : PageModel
    {
        [BindProperty]
        public int VisitId { get; set; }
    
        [BindProperty]
        public CrudMode CrudMode { get; set; }
    
        public void OnGet(int id)
        {
            CrudMode = CrudMode.Update;
            VisitId = id;
        }
    
        public void OnGetCreate()
        {
            CrudMode = CrudMode.Create;
        }
    }
    
    我的理解是,“handler”参数是可选的,当导航到此页面而不指定它时,会调用默认的“event”(即OnGet())

    但目前:

  • “/visions/10”我得到了“OnGet”事件,但“Id”值为0(默认值)
  • “/visions/create”我得到了我的“OnGetCreate”活动
  • “/visions/create/10”我仍然得到我的“OnGetCreate”事件,这是合乎逻辑的,但我想禁止这样做
  • “/visions/anythingelse/10”我得到了我的“OnGet”事件和正确的“Id”值
  • 在谷歌搜索时,我发现了很多关于可选处理程序和可选参数的信息,但没有发现它们的组合,这让我觉得我在做一些奇怪的事情。如果我为“编辑”和“创建”模式创建单独的页面,也许我可以处理这个问题,但我不希望这样,因为我必须复制很多布局。当然,在这种情况下,我可以创建一个局部视图或视图组件,但对于这样一个简单的任务来说,这似乎有点过分了

    此外,我希望避免改变应用程序惯例(即使用AddRazorPagesOptions)


    所以本质上的问题是,在这种情况下,如何正确地组合可选处理程序和可选参数?因此,至少“OnGet”是一个正确的参数。

    在我看来,你把事情复杂化了(礼貌地说是“做了一些奇怪的事情”)。最终,您将得到一个页面模型,它看起来像一个MVC控制器,具有太多的操作/处理程序,这是Razor Pages设计要避免的。您正在与Razor Pages进行斗争,这就是您遇到问题的原因


    创建和编辑的单独页面是最好的选择,而片段对于CRUD表单的复制部分来说是理想的选择。

    好吧,我期待着这样的事情。也许如果Razor页面根本不支持处理程序,我就不会尝试使用它们并首先使用片段。