在 Razor 页面路由中组合可选处理程序和参数
Combine optional handler and parameter in Razor Page route
我有一个页面“/visits”。输出访问列表。
单击任何访问时,我需要导航到“/visits/10”,其中“10”是访问的 ID。
这是简单的部分。
现在是其他 "CRUD" 操作,现在是 "Create"。我希望“/visits/create”用于创建。
我现在有什么:
- "Visits.cshtml" 剃须刀页面和型号
- "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())。
但目前:
- "/visits/10" 我收到 "OnGet" 事件,但 "Id" 值为 0(默认)
- "/visits/create" 我得到了我的 "OnGetCreate" 事件
- "/visits/create/10" 我仍然得到我的 "OnGetCreate" 事件,这是合乎逻辑的,但我想禁止这个
- "/visits/anythingelse/10" 我得到我的 "OnGet" 事件并更正 "Id" 值
在谷歌搜索时,我发现了很多关于可选处理程序和可选参数的信息,但没有关于它们的组合的信息,这让我觉得我在做一些奇怪的事情。如果我为 "edit" 和 "create" 模式创建单独的页面,也许我可以解决这个问题,但我不想要这个,因为我将不得不复制很多布局。当然,在这种情况下我可以创建局部视图或视图组件,但对于这样一个简单的任务来说似乎有点过分了。
而且我想避免改变应用程序约定(即使用 AddRazorPagesOptions)。
所以本质上,问题是在这种情况下如何正确组合可选处理程序和可选参数?这样至少 "OnGet" 得到一个正确的参数。
在我看来,您使事情过于复杂(礼貌地说“做一些奇怪的事情”)。您最终会得到一个看起来像 MVC 控制器的页面模型,其中包含太多 actions/handlers,这是Razor Pages 旨在避免什么。您正在与 Razor Pages 作斗争,这就是您遇到问题的原因。
创建和编辑的单独页面是可行的方法,partials 是 CRUD 表单重复部分的理想选择。
我有一个页面“/visits”。输出访问列表。 单击任何访问时,我需要导航到“/visits/10”,其中“10”是访问的 ID。 这是简单的部分。 现在是其他 "CRUD" 操作,现在是 "Create"。我希望“/visits/create”用于创建。
我现在有什么:
- "Visits.cshtml" 剃须刀页面和型号
- "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())。
但目前:
- "/visits/10" 我收到 "OnGet" 事件,但 "Id" 值为 0(默认)
- "/visits/create" 我得到了我的 "OnGetCreate" 事件
- "/visits/create/10" 我仍然得到我的 "OnGetCreate" 事件,这是合乎逻辑的,但我想禁止这个
- "/visits/anythingelse/10" 我得到我的 "OnGet" 事件并更正 "Id" 值
在谷歌搜索时,我发现了很多关于可选处理程序和可选参数的信息,但没有关于它们的组合的信息,这让我觉得我在做一些奇怪的事情。如果我为 "edit" 和 "create" 模式创建单独的页面,也许我可以解决这个问题,但我不想要这个,因为我将不得不复制很多布局。当然,在这种情况下我可以创建局部视图或视图组件,但对于这样一个简单的任务来说似乎有点过分了。
而且我想避免改变应用程序约定(即使用 AddRazorPagesOptions)。
所以本质上,问题是在这种情况下如何正确组合可选处理程序和可选参数?这样至少 "OnGet" 得到一个正确的参数。
在我看来,您使事情过于复杂(礼貌地说“做一些奇怪的事情”)。您最终会得到一个看起来像 MVC 控制器的页面模型,其中包含太多 actions/handlers,这是Razor Pages 旨在避免什么。您正在与 Razor Pages 作斗争,这就是您遇到问题的原因。
创建和编辑的单独页面是可行的方法,partials 是 CRUD 表单重复部分的理想选择。