0

asp.net mvc 3を使用していますが、変更の投稿中にtryUpdateModelの使用に問題があります。

アイテムの複数のリストを含むモデルがあり、ビューでAjaxによってアイテムを追加または削除でき、保存ボタンを使用して変更を保存できます。

コレクションにアイテムを追加すると、TryUpdateModelは正常に機能しますが、コレクション内のすべてのアイテムを削除すると、このコレクションはフォーム値で投稿されなくなり、TryUpdateModelはコレクションをクリアする代わりに何もしません。

このシナリオをどのように処理できますか?誰かがこれに対する回避策を見つけましたか?DefaultModelBinderをオーバーライドする必要がありますか?

ありがとう

4

2 に答える 2

1

コレクションがクリアされない理由はわかりませんが、回避策として、関連するフォーム値が欠落していることを検出し、手動でアイテムを削除することが考えられます。何かのようなもの:

public ActionResult Edit(SomeEntity obj)
{
    if(Request.Form["expectedFormValue"] == null)
    {
        obj.YourCollection.Clear();
    }
    TryUpdateModel(obj);
}
于 2012-04-06T14:50:55.347 に答える
0

私はちょうどこの問題に対処してきました。結局のところ、のコードにTryUpdateModelは何の問題もありませんが、 がValueProvider与えるものに完全に依存しています。

AJAX(私の場合も)に関してJsonValueProviderFactoryは、レスポンスを解析し、メソッドを実行するコントローラーに値を与える人である可能性が非常に高く、コントローラーTryUpdateModelはそこにある値を決して見つけられません。値プロバイダーによって提供されたプロパティに基づいて宛先モデルのみを更新するためTryUpdateModel、空になったコレクションには触れません。これらのプロパティはプロバイダーによってまったく送信されないためです。

これを実現するコードは の次の行でJsonValueProviderFactory、サイズがゼロの配列では値がバッキング ストアに追加されないため、プロパティが「消失」します。

2012 年 1 月の ASP.NET Codeplex サイト ( Json Request with empty array ) でこのバグのレポートを見つけ、wallymathieu (送信者) がそれを処理するパッチを提供しました。これは、パッチの関連部分です。

//BEGIN CHANGE
if (l.Count == 0) {
    AddToBackingStore(backingStore, prefix, null);
}
else for (int i = 0; i < l.Count; i++) {
//END CHANGE

彼がここで行っているのは、配列が空として送信されたときに null 値を持つプロパティを追加することです。

ValueProviderFactoryそこに公開されているコードを使用して独自のコードを作成し、Global.asaxファイルApplication_Startメソッドでこれを行うことでアプリケーションに接続できます。

ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().FirstOrDefault());
ValueProviderFactories.Factories.Add(new YourOwnJsonValueProviderFactory());

これで私の問題は解決しました。あなたと将来のTryUpdateModel'ersにも解決されることを願っています。

于 2013-01-30T02:55:20.613 に答える