【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をつける必要がある。