我有一个小的ASP.NET Core Razor Pages项目。我正在制作一个具有基本搜索功能的简单列表显示页面。在我的模型中,我有4个页面处理程序(其中2个是为调试目的而添加的):
public async Task OnGetAsync()
{
Posting = await _context.Postings
.Include(p => p.ItemDetails).Include(p => p.Owner).ToListAsync();
}
public async Task OnPostAsync()
{
Posting = await _context.Postings
.Include(p => p.ItemDetails).Include(p => p.Owner).ToListAsync();
}
public async Task<PageResult> OnGetSearchAsync(String search)
{
if (String.IsNullOrEmpty(search))
{
search = search.Trim();
Posting = await _context.Postings.Where(p => p.ItemDetails.ItemName.Contains(search)).ToListAsync();
}
return Page();
}
public async Task<PageResult> OnPostSearchAsync(String search)
{
if (!String.IsNullOrEmpty(search))
{
search = search.Trim();
Posting = await _context.Postings
.Where(p => p.ItemDetails.ItemName.Contains(search)).ToListAsync();
}
return Page();
}
当表单使用
method="post"
指定
asp-page-handler="search"
时,表单将调用正确的处理程序(
OnPostSearchAsync(String search)
)。但是,当表单使用
method="get"
指定
asp-page-handler="search"
时,表单将调用错误的处理程序(
OnGetAsync()
)。这是故意的吗?如果是这样,我如何在使用
GET
方法时调用自定义处理程序?也许没有必要使用自定义处理程序,但我想我应该可以。
这是
.cshtml
文件中的相关代码:
<div id="posting_search_bar_container">
<form method="get" asp-page-handler="search">
<input type="text" name="search" />
<input type="submit" value="Ara" />
</form>
</div>
<div id="posting_list_container">
@if (Model.Posting != null)
{
@foreach (var posting in Model.Posting)
{
<partial name="./Partials/_Posting" model="new Pages.Postings.Partials.PostingModel(posting);" />
}
}
</div>
请您参考如下方法:
关于发生这种情况的原因,this answer应该解释这里发生了什么。本质上,asp-page-handler
设置了一个包含?handler=search
的操作URL,然后该URL被浏览器丢弃以获取GET请求。
在变通办法方面,我看到两个:
选项1 -Customise the routing
直接从文档中获取,您可以在.cshtml中略微修改page指令,以自定义路由:
@page "{handler?}"
此选项表明,对于给定的页面,请使用一个额外的段来指定处理程序名称,而不是将其设置为查询字符串参数。这意味着您的通话将从
/PageName?handler=handlerName
到
/PageName/Handler
。来自代码片段的
?
表达式中的
{handler?}
仅声明处理程序名称是可选的,因此默认为例如
OnGetAsync
。
此选项之所以有效,是因为不再需要查询字符串值来让浏览器进行垃圾回收,但是处理程序名称仍在路由本身内捕获。
选项2 -使用隐藏的输入
使用GET将表单提交到已定义的操作URL时,浏览器将从表单中的控件构建查询字符串。这提供了向表单添加新的隐藏输入字段的选项:
<form method="get">
<input type="hidden" name="handler" value="search" />
<input type="text" name="search" />
<input type="submit" value="Ara" />
</form>
在这里,我删除了
asp-page-handler
并添加了一个隐藏的输入,该输入最终将
handler
的查询字符串值设置为
search
,从而建立了一个与您的示例中的
OnGetSearchAsync
匹配的查询字符串。