为了账号安全,请及时绑定邮箱和手机立即绑定

Razor 页面,表单页面处理程序不适用于 GET 方法

Razor 页面,表单页面处理程序不适用于 GET 方法

C#
桃花长相依 2021-08-07 16:49:19
我有一个小的 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>
查看完整描述

1 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

为什么会发生这种情况而言,这个答案应该解释这里发生了什么。本质上,asp-page-handler设置一个包含 的操作 URL,?handler=search然后浏览器会将 GET 请求丢弃。

在解决方法方面,我看到两个:

选项 1 -自定义路由

直接从文档中获取,您可以在 .cshtml 中稍微修改页面指令以自定义路由:

@page "{handler?}"

此选项声明对于给定页面,使用额外的段来指定处理程序名称,而不是将其设置为查询字符串参数。这意味着您的呼叫将从 eg 更改/PageName?handler=handlerName/PageName/Handler. 代码片段中的?in{handler?}表达式只是声明处理程序名称是可选的,因此默认为 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>

在这里,我删除了asp-page-handler并添加了一个隐藏输入,该输入最终将设置handlerto的查询字符串值search,这将构建一个与OnGetSearchAsync您的示例匹配的查询字符串。


查看完整回答
反对 回复 2021-08-07
  • 1 回答
  • 0 关注
  • 265 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信