私は MVC 4 に基づく Web アプリに取り組んでおり、HTML フォームで何らかの作業をしようとしています。次のように、ビューモデルにいくつかの個別のモデルがあります。
public class NewAccountViewModel
{
UserModel User { get; set; }
AccountModel Account { get; set; }
TicketModel Ticket { get; set; }
}
次に、これをビューのモデルとして使用します。ビューは、各モデルの部分ビューでも構成されます。これらの各部分ビューもビュー モデルをモデルとして使用し、次のようにメイン ビューからビュー モデル インスタンスを渡します。
@Html.Partial("~/Views/Account/_User.cshtml", Model)
次に、部分ビューに次のようなフィールドを追加します。
@Html.TextBoxFor(m => m.User.Name)
私の POST ハンドラーでは、ビュー モデル インスタンスをパラメーターとして受け入れ、そこでフォームから送信されたデータを操作できます。フォームはjQuery.post
、 を$('#nameofmyform').serialize()
データとして使用して送信されます。
このアプローチは、期待どおりに機能します。ただし、部分ビューとビュー モデルの間の結合が強すぎます。別のビュー モデルを持つ別のコントローラーで User モデルを使用したい場合、部分ビューがこの特定のビュー モデルを使用するため、それは不可能です。
だから、私が試みたのはこれでした:
@Html.Partial("~/Views/Account/_User.cshtml", Model.User)
次に、実際のモデルを部分ビューのモデルとして使用して、フィールドをバインドしました。
@Html.TextBoxFor(m => m.Name)
これは、すべてのフィールドにビュー モデルとそこに含まれるモデルからのデータが正しく入力されるという点で、一方向に機能します。ただし、POST では、ビュー モデルが正しくシリアル化されません。フォームから返されたデータを調べると、すべてがビュー モデルにバインドされている最初のアプローチでは、次のようなデータでフォームがシリアル化されていることがわかります。
{ "User.Name" : "Blahblah" ...
2 番目のアプローチでは、モデルによってフォームをシリアル化するだけです。
{ "Name" : "Blahblah" ...
これにより、ビュー モデルのモデル プロパティは、POST ハンドラーですべて null 値になります。
だから、私が本当に疑問に思っているのはこれです:ビューモデルからプロパティ名を何らかの形で先頭に追加して、ビューモデルに適切にシリアル化することは可能ですか? JavaScript/jQuery でこれを行う必要がありますか、それとも .NET コードで行うことができますか?