首页 > 解决方案 > 在 Razor 页面路由中组合可选的处理程序和参数

问题描述

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

我现在有什么:

  1. “Visits.cshtml”剃须刀页面和模型
  2. “Visit.cshtml”剃须刀页面,我想同时用作“编辑”和“创建”页面。

我尝试为“Visit.cshtml”自定义“页面”指令,如下所示:

@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;
    }
}

我理解这一点的方式是“处理程序”参数是可选的,当导航到此页面而不指定它时,会调用默认的“事件”(即 OnGet())。

但目前:

  1. “/visits/10” 我得到了“OnGet”事件,但“Id”值为 0(默认)
  2. “/visits/create”我得到了“OnGetCreate”事件
  3. “/visits/create/10”我仍然得到我的“OnGetCreate”事件,这是合乎逻辑的,但我想禁止这个
  4. “/visits/anythingelse/10” 我得到了“OnGet”事件并更正了“Id”值

在谷歌搜索时,我发现了很多关于可选处理程序和可选参数的信息,但没有关于它们的组合,这让我觉得我在做一些奇怪的事情。如果我为“编辑”和“创建”模式创建单独的页面,也许我可以管理这个,但我不想要这个,因为我必须复制很多布局。当然,在这种情况下,我可以创建局部视图或视图组件,但对于这样一个简单的任务来说,这似乎有点矫枉过正。

而且我还想避免更改应用程序约定(即使用 AddRazorPagesOptions)。

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

标签: asp.net-mvcasp.net-corerazorroutingrazor-pages

解决方案


在我看来,您将事情过度复杂化(礼貌地说“做一些奇怪的事情)。您最终会得到一个看起来像 MVC 控制器的 PageModel 具有太多动作/处理程序,这是 Razor Pages 旨在避免的. 您正在与 Razor Pages 作斗争,这就是您遇到问题的原因。

创建和编辑的单独页面是要走的路,部分是 CRUD 表单的重复部分的理想选择。


推荐阅读