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

时间:2018-06-12 10:45:33

标签: 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();
        }

当表单使用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 个答案:

答案 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