在Razor Page路由中合并可选的处理程序和参数

时间:2019-11-24 09:57:29

标签: asp.net-mvc asp.net-core razor routing razor-pages

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

我现在有什么?

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

我尝试像这样为“ 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. “ /访问/创建”我得到了“ OnGetCreate”事件
  3. “ / visits / create / 10”我仍然收到我的“ OnGetCreate”事件,这很合逻辑,但是我想禁止这样做
  4. “ / visits / anythingelse / 10”我得到了“ OnGet”事件并更正了“ Id”值

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

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

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

1 个答案:

答案 0 :(得分:1)

在我看来,您使事情变得过于复杂(礼貌地说“做一些奇怪的事情”)。最终,您会得到一个看起来像MVC控制器且动作/处理程序过多的PageModel,这就是Razor Pages旨在避免这种情况。您正在与Razor Pages作战,这就是您遇到问题的原因。

创建和编辑使用单独的页面是必经之路,对于CRUD表单的重复部分,局部页面是理想的选择。