web-dev-qa-db-ja.com

Razorページ、フォームページハンドラーがGETメソッドで機能しない

小さな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>
_
9
user3402183

whyこれが発生した場合、 this answer はここで何が起こっているかを説明する必要があります。基本的に、asp-page-handler?handler=searchを含むアクションURLを設定し、GETリクエストのためにブラウザによってゴミ箱に入れられます。

回避策に関しては、2つあります。

オプション1- ルーティングをカスタマイズ

ドキュメントから直接引用して、ルーティングをカスタマイズするために、.cshtmlのページディレクティブを少し変更できます。

@page "{handler?}"

このオプションは、特定のページについて、クエリ文字列パラメーターとして設定するのではなく、ハンドラー名を指定するために追加のセグメントを使用することを示しています。それはあなたの呼び出しが例えばから変わることを意味します。 /PageName?handler=handlerNameから/PageName/Handlerへ。コードスニペットからの?式の{handler?}は、ハンドラー名がオプションであることを単に示しているため、デフォルトで次のようになります。 OnGetAsync

このオプションは、ブラウザがゴミ箱に移動するためのクエリ文字列値がなくなったために機能しますが、ハンドラ名isはルート自体にキャプチャされます。

オプション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に一致します。

14
Kirk Larkin