2

次のシナリオで問題を解決しようとしています。

  • ユーザーがページを読み込み、EditorTemplate ViewModel が読み込まれます。
  • ユーザーがページ上でダイアログを開きます。
  • このダイアログは、その中に同じ EditorTemplate ViewModel をロードします。
  • DOM ツリーに存在する各コントロールの複数のインスタンスにより、コントロール ID が一意ではなくなりました。

これに対する私の解決策は、Dialog 内に ViewModel を構築したいことをコントローラーに示すことです。これは、生成されたコントロール ID に追加する必要がある「プレフィックス」文字列を示すことによって行います。この提案は、この StackOverflow の投稿から取り入れました。

そのため、ViewModel で次のように宣言されたコントロールがあります。

<%--This will append our model's prefix onto all generated IDs to ensure uniqueness.--%>
<% using (Html.BeginHtmlFieldPrefixScope(Model.Prefix)) { %>
<div class="detailsRow required">
    <%= Html.LabelFor(model => model.Name, Model.NameLabel) %>
    <%= Html.EditorFor(model => model.Name) %>
</div>
<% } %>

そして私のモデルでは:

public NewOrderDetailsModel(string prefix) : this()
{
    Prefix = prefix;
}

これは正常に動作します。コントロールの ID を変更する効果があります。「名前」ではなく「prefix_Name」としてレンダリングされます。

ただし、データをサーバーに投稿すると、変更によって MVC の変換マジックが壊れます。

ここに画像の説明を入力

ご覧のとおり、ID が変更されたすべてのプロパティが null として返されます。

2 部構成の質問:

  • これは、目的の効果を達成するために下る正しい道ですか?
  • JSON からモデルへの変換が元に戻るように ID が変更されたことを MVC に通知するにはどうすればよいですか?
4

1 に答える 1

3

あなたが話すMVC変換マジックは、MVCモデルバインダーを使用して行われます。デフォルトのモデルバインダーは、プレフィックスの存在を認識していなかったため、この方法でプレフィックスを処理しません。次のようにコントローラーのアクションに注釈を付けることで、それを認識させることができます。

public ActionResult SomeAction([Bind(Prefix = "SomePrefix")] ViewModel model){...}

詳細については、次の投稿を参照してください: ASP.NETMVC3モデルバインディングとフォームフィールド

于 2013-01-23T19:32:24.453 に答える