【解決方法】newuserid というプロパティに対するネットコアのモデルバインディングが機能しない


これは非常に奇妙な問題で、私は 2 ~ 3 日間悩んでいました。 Net Core 6.0 MVC Web アプリを使用しています。

私のビューモデルには次のようなプロパティがあります。

public class ConfirmCodeViewModel
{
...
public long NewUserId { get; set; }
...
}

モデルにデータが設定され、ビューに渡され、この値がフォーム内の非表示の入力に保存されます。これはすべて非常に標準的なものです。

@model ConfirmCodeViewModel
...
<form asp-action="ConfirmCode" method="post">
...
<input type="hidden" asp-for="NewUserId" />
...
</form>

フォームが POST されると、NewUserId はゼロとして返されます。ポストされたフォーム データには NewUserId のエントリがないため、受信モデルにバインドされません。

プロパティ名をUserIdに変更すると

public long UserId { get; set; }

その後、バインドされて正しく返されます。

モデルは次のようにアクションで受信されます。

public async Task<IActionResult> ConfirmCode(ConfirmCodeViewModel inputModel)

他のすべてのモデル プロパティは正しくバインドされます。

これで問題は解決しましたが、NewUserId という名前のプロパティで機能しない理由を知りたいと思っています。

ご意見ありがとうございました。

PS コードのフォーマットが少し不安定だったら申し訳ありません。私の無能さです。

私が試したこと:

型を文字列に変更してみました

public string NewUserId { get; set; }

しかし、それもうまくいきませんでした。

受信した Request.Form コレクションを検査しましたが、NewUserId という項目が返されませんでした。

ビューをチェックして、同じ ID を持つ重複要素がないことを確認しました。

値がビュー内に設定されていることを (JS を使用して) 確認しました。

POST はいかなる方法でも (JS などによって) インターセプトされません。

解決策 1

私の考えでは、調査すべき最も明らかなことは、POST 呼び出しのサーバー側で予期されるプロパティの名前です。 NewUserId という名前かどうかを確認します。 実際には、値を送信するときに取得する UserId と呼ばれているのではないかと思います。 プロパティの名前が UserId で、引き続き NewUserId をローカルで使用したい場合は、反対側で予期される名前でプロパティをいつでも修飾できます (この例では NewtonSoft を使用します)。

C#
[JsonProperty("UserId")]
public long NewUserid { get; set; }

コメント

タイトルとURLをコピーしました