我在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'。
我该如何解决这些问题,或者最好的解决方法是什么?
答案 0 :(得分:1)
首先,您不能有多个具有相同名称的处理程序,只能由同一页面中的参数来区分。您需要选择其他名称。
第二,处理程序方法唯一允许的返回类型是IActionResult
,void
,Task
和Task<IActionResult>
。如果要从处理程序返回值“ true”,请以ContentResult
或JsonResult
的字符串形式返回。
答案 1 :(得分:1)
对于问题1 ,这是设计使然,并且受IPageApplicationModelProvider
和IPageHandlerMethodSelector
控制,它通过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