ASP.NET核心剃刀页面-重载方法

时间:2018-11-09 16:53:25

标签: asp.net-core razor-pages

我在ASP.NET核心剃刀页面中一直遇到两个问题,但没有找到任何内容。

问题1:我一直在尝试在页面组件上进行重载,但似乎无法使其正常工作,我在方法上使用了可为空的参数,但我不知道这是否是最好的方法,还有更好的方法吗?

我正在做什么:

//对于新项目或编辑项目

公共IActionResult OnGetModal(int?squid)

我想要的东西:

//对于新项目

公共IActionResult OnGetModal()

//对于编辑模式

公共IActionResult OnGetModal(int squid)

注意:如果相反,我使用具有空值参数的唯一方法,而是使用两种方法(一种没有参数的方法,另一种具有int参数的方法),则由于我有多个处理程序,因此出现错误。


问题2:我有2个具有相同参数名称的方法,尝试引用该处理程序时出现错误。

方法1:

公共IActionResult OnGetModal(int?squid)

方法2:

公共布尔OnPostActivateDeactivate(int鱿鱼,布尔isActive)

在这里,我正在尝试访问方法Modal:

URL:?handler = modal&squid = 1001

错误:InvalidOperationException:不支持的处理程序方法返回类型为'System.Boolean'。

我该如何解决这些问题,或者最好的解决方法是什么?

2 个答案:

答案 0 :(得分:1)

首先,您不能有多个具有相同名称的处理程序,只能由同一页面中的参数来区分。您需要选择其他名称。

第二,处理程序方法唯一允许的返回类型是IActionResultvoidTaskTask<IActionResult>。如果要从处理程序返回值“ true”,请以ContentResultJsonResult的字符串形式返回。

答案 1 :(得分:1)

对于问题1 ,这是设计使然,并且受IPageApplicationModelProviderIPageHandlerMethodSelector控制,它通过httpMethod和{{1}来区分处理}。您可以通过以下代码实现自己的handlerName

IPageHandlerMethodSelector

您可以像下面这样注册自己的 //Setp 3: remove candidates with non-matching parameters for (var i = candidates.Count - 1; i >= 0; i--) { var handler = candidates[i]; var request = context.HttpContext.Request.Query.Count - 1; if (handler.Parameters.Count != request) { candidates.RemoveAt(i); } }

IPageHandlerMethodSelector

此处已完成CustomDefaultPageHandlerMethodSelector

对于问题2:,您需要像下面这样传递services.AddSingleton<IPageHandlerMethodSelector, CustomDefaultPageHandlerMethodSelector>();

RequestVerificationToken