【Razor Pages】SupportsGetについて
クライアント側からサーバー側にデータを渡したい場合、publicプロパティに[BindProperty]属性をつけることで、クライアントから送られてきたデータを自動的にそのプロパティで受け取ることができる。 これによって、Httpリクエストのリクエストボディからデータを取得してプロパティに代入するなどのコードを記述する必要がなく、ロジックに集中できる。
[BindProperty]属性をつけただけであれば、Postリクエストを対象としてユーザからのデータがプロパティに入ることになる。 ではGetリクエスト(クエリ文字列でデータを渡す)の場合はというと、既定ではBindの対象外であり、明示するする必要がある。 この場合、[BindProperty(SupportsGet=true)]とする必要がある。
例えば以下のようにMessageプロパティにBindProperty属性をつける。
public class SupportsGetModel : PageModel { [BindProperty] public string Message { get; set; } public SupportsGetModel() { this.Message = string.Empty; } public IActionResult OnGet() { var message = Message; return Page(); } }
そして以下のようにクライアントからGetリクエストでMessageプロパティに値を送るようにする。
@page
@model AspNetCore_RazorPages_Practice.Pages.SupportsGetModel
@{
}
<p>
@Model.Message
</p>
<p>
<form>
<p>
Message: <input asp-for="@Model.Message" />
<button type="submit">送信</button>
</p>
</form>
</p>
このビューの見た目は以下のとおり。

テキストボックスに「hello」と入力して「送信」ボタンを押すと、サーバー側ではMessageプロパティの値に変化はない。

次にBindProperty属性にSupportsGet=trueをつけて、同様にデータを送信するとMessageプロパティにテキストボックスの値が入る。

このように表示される。

以上のようにGetリクエストでクライアントから送られてきたデータをプロパティで受け取りたい場合(バインディングしたい場合)は、BindProperty属性にSupportsGet=trueをつける必要がある。