小さな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>
_
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
に一致します。