我有一个小的ASP.NET Core 2.1 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>
感谢阅读!
答案 0 :(得分:6)
就为什么而言,this answer应该解释这里发生了什么。从本质上讲,asp-page-handler
会设置一个包含?handler=search
的操作网址,然后由浏览器针对GET请求进行删除。
就解决方法而言,我看到两个:
选项1 - Customise the routing
直接从文档中获取,您可以在.cshtml中稍微修改您的页面指令,以便自定义路由:
@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
,从而构建查询-string将匹配示例中的OnGetSearchAsync
。