shuhelohelo’s blog

Xamarin.Forms多めです.

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