我有一个小的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> 

请您参考如下方法:

关于发生这种情况的原因,this answer应该解释这里发生了什么。本质上,asp-page-handler设置了一个包含?handler=search的操作URL,然后该URL被浏览器丢弃以获取GET请求。

在变通办法方面,我看到两个:

选项1 -Customise the routing

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

@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,从而建立了一个与您的示例中的 OnGetSearchAsync匹配的查询字符串。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!