【.NET MVC】
大量のinputタグをControllerにうまくPOSTするTIPS

記事イメージ

ASP.NET Core MVCでは、POSTでバインド可能なinputは、デフォルトで1024個となっています。

グリッド入力などを組んでいると1024では足りない場面もあるかと思いますので、解決の豆知識を紹介します。

前提:inputが1024個を超えると、バインド変数がnullでControllerに渡される

以下のViewで実験してみます。FOR句でinput[type=text]を1024個生成します。submitと合わせて1025個になり上限オーバーしています。

Razor
@using (Html.BeginForm()) {
    <input type="submit" name="submit">
    @for (int i = 0; i < 1024; i++) {
        <input type="text" name="name@(i)" value="@i">
    }
}

入力フィールドを大量生成しています。
入力フィールドを大量生成しています

この状態でPOSTすると、上限オーバーのためバインド変数(ここではcollection)がnullでControllerに渡されます。

collectionはnullです。
collectionはnullです
1024個ピッタリまでOKです。type=hiddenでCSRFトークンが挿入されているとその分も1個とカウントされるので注意しましょう。
1024個ピッタリまでOKです

inputのPOST時バインド上限を変更する

ControllerのPOSTメソッドにRequestFormLimitsAttributeを付与することで上限を変更可能です。

10000とかに増やしてもきちんとバインドされますが、あまり増やしすぎるとブラウザーのメモリ使用量が上がりすぎるので、設計に注意しましょう。

C#
[HttpPost]
[RequestFormLimits(ValueCountLimit = 10000)] //←コレを追加
public IActionResult Index([FromForm]IFormCollection collection) {
    return View();
}

10000個のinputでもきちんとバインドされます。
10000個のinputでもきちんとバインドされます
【社内PR】チーム・ウォーク

inputタグをPOST時バインドから除外するテクニック

name属性がないinputタグの入力内容は、ControllerのPOSTメソッドから除外されます。

設計上の上限を気にしつつrequire属性を使いたいなどのケースで便利です。

Razor
@using (Html.BeginForm()) {
    <input type="submit" name="submit">
    @for (int i = 0; i < 9998; i++) {
        //実験として、name属性を外して9998個設置
        <input type="text" value="@i">
    }
}

9998個のname属性なしinputは除外され、それ以外がきちんとバインドされました。
9998個のname属性なしinputは除外され、それ以外がきちんとバインドされました

記事筆者へのお問い合わせ、仕事のご依頼

当社では、IT活用をはじめ、業務効率化やM&A、管理会計など幅広い分野でコンサルティング事業・IT開発事業を行っております。

この記事をご覧になり、もし相談してみたい点などがあれば、ぜひ問い合わせフォームまでご連絡ください。

皆様のご投稿をお待ちしております。

記事筆者へ問い合わせする

※ご相談は無料でお受けいたします。

この記事へのコメント

ニックネーム(任意)

返信通知先Emailアドレス(任意)

本文


* 感想やご意見等、お気軽にコメントください。但し、公序良俗に反するコメントはお控えください。
* 管理者が承認したコメントはこの箇所に公開させていただく可能性がございます。
* 返信通知先Emailアドレスは、筆者のみに通知され、公開されることはありません。返信通知先Emailを入力された場合は、コメントへの返信をこちらに掲載した際に通知させていただきます。その他の目的には使用いたしません。
* スパム対策のため、コメントは日本語のみ受け付けております。

堺財経電算合同会社 小規模IT構築サービス