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

Combine optional handler and parameter in Razor Page route

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

我现在有什么:

  1. "Visits.cshtml" 剃须刀页面和型号
  2. "Visit.cshtml" razor 页面,我想同时用作 "edit" 和 "create" 页面。

我尝试像这样为 "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())。

但目前:

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

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

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

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

在我看来,您使事情过于复杂(礼貌地说“做一些奇怪的事情”)。您最终会得到一个看起来像 MVC 控制器的页面模型,其中包含太多 actions/handlers,这是Razor Pages 旨在避免什么。您正在与 Razor Pages 作斗争,这就是您遇到问题的原因。

创建和编辑的单独页面是可行的方法,partials 是 CRUD 表单重复部分的理想选择。