1

私は 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 コードで行うことができますか?

4

2 に答える 2

3

パーシャルの代わりにエディター テンプレートを使用します。

@Html.EditorFor(x => x.User, "_User")

そして次のように定義します~/Views/Shared/EditorTemplates/_User.cshtml:

@model User
...
@Html.TextBoxFor(m => m.Name)

パーシャルとは対照的に、エディター テンプレートはナビゲーション コンテキストを尊重するため、入力フィールドに正しい名前が付けられるようになりました。

于 2013-03-11T15:48:45.623 に答える
0

次のようにフィールドプレフィックスを設定できます。

ViewData.TemplateInfo.HtmlFieldPrefix = "User";
于 2013-03-11T15:49:00.693 に答える