use*_*183 7 razor asp.net-core razor-pages
我有一个小的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();
}
Run Code Online (Sandbox Code Playgroud)
当表单指定method="post"时asp-page-handler="search",表单调用正确的handler(OnPostSearchAsync(String search)).但是,当表单指定method="get"时asp-page-handler="search",表单调用错误的handler(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>
Run Code Online (Sandbox Code Playgroud)
谢谢阅读!
Kir*_*kin 10
关于发生这种情况的原因,此答案应解释这里发生了什么。本质上,asp-page-handler设置一个包含的操作URL,?handler=search然后该URL 将被浏览器丢弃以获取GET请求。
在变通办法方面,我看到两个:
选项1 - 自定义路由
直接从文档中获取,您可以在.cshtml中略微修改page指令,以自定义路由:
@page "{handler?}"
Run Code Online (Sandbox Code Playgroud)
此选项指出,对于给定的页面,请使用一个额外的段来指定处理程序名称,而不是将其设置为查询字符串参数。这意味着您的通话将改变如/PageName?handler=handlerName到/PageName/Handler。代码段?中的{handler?}表达式中的in 只是声明处理程序名称是可选的,因此默认为eg 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>
Run Code Online (Sandbox Code Playgroud)
在这里,我删除了,asp-page-handler并添加了一个隐藏的输入,该输入最终将把的查询字符串值设置handler为search,从而建立了一个与OnGetSearchAsync您的示例匹配的查询字符串。
| 归档时间: |
|
| 查看次数: |
4985 次 |
| 最近记录: |