Razor Pages,表单页面处理程序不使用GET方法

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并添加了一个隐藏的输入,该输入最终将把的查询字符串值设置handlersearch,从而建立了一个与OnGetSearchAsync您的示例匹配的查询字符串。

  • 如何在“.cshtml.cs”中处理此自定义路由?我有一个名为“search”的方法,但仍然调用“onPost”。我该如何调试这个? (2认同)