2009-07-30 13 views
6

誰もがこれに運があったのですか?ASP.NET MVCのUpdateModelで動作するIncludePropertiesを取得できないようです

public string Name { get; set; } 
public string Details { get; set; } 
public DateTime? Created { get; set; } 

、その後、私は実行します:

var myModel = getCurrentModelFromDb(id); 
UpdateModel(myModel, "ModelName", new string { "Name", "Details" }); 

べきこのONLY更新を

私は単純なモデルを持っている場合のはと言わせて、私はそれを正しく理解すれば、私に知らせてください。名前と詳細のプロパティ? 「作成済み」のデータベースから既に日付があったとします。上記を実行すると、作成日が01-01-0001に設定されているようです。私は、明示的にこのフィールドを除外しようとすると、

また、:

UpdateModel(myModel, "ModelName", 
    new string { "Name", "Details" }, new string { "Created" }); 

それはまだ01-01-0001に設定されています。これはバグですか、私が間違っているのですか?

私が効果的にやりたいことは、対応するフォームフィールドがあるモデルプロパティを更新するだけですが、dbフェッチだけで設定された残りのものはそのままにして、nullまたはdefaultに設定しません。それが現在行われているようです。

実際のシナリオと上記との唯一の違いは、リスト上でupdateModelを使用していることです。そのため、listFromDb(parentId)を取得してからupdateModel(myList、 "ListPrefix")を適用しています。 [0]、[1]などで各アイテムをピックアップするものです。すべての名前が更新されているので動作しますが、それ以外のものは更新されません。

更新:おそらく 'includeProperties'は、バインドの仕組みと同様に、フォームから含めるプロパティを定義することだと認識しています。 * *の場合、どうすれば特定のモデルのプロパティのみを更新するように指示できますか?

答えて

1

私はこの使用してリフレクターに見てきた...コールスタックは、次のとおりです。

UpdateModel() - >TryUpdateModel() - >DefaultModelBinder.BindModel() --->のいずれかBindComplexModel()またはBindSimpleModel()。ここで

BindSimpleModel()のための解体です:

if (bindingContext.ModelType != typeof(string)) 
    { 
     if (bindingContext.ModelType.IsArray) 
     { 
      return ConvertProviderResult(bindingContext.ModelState, bindingContext.ModelName, valueProviderResult, bindingContext.ModelType); 
     } 
     Type type = ExtractGenericInterface(bindingContext.ModelType, typeof(IEnumerable<>)); 
     if (type != null) 
     { 
      object o = this.CreateModel(controllerContext, bindingContext, bindingContext.ModelType); 
      Type collectionType = type.GetGenericArguments()[0]; 
      Type destinationType = collectionType.MakeArrayType(); 
      object newContents = ConvertProviderResult(bindingContext.ModelState, bindingContext.ModelName, valueProviderResult, destinationType); 
      if (typeof(ICollection<>).MakeGenericType(new Type[] { collectionType }).IsInstanceOfType(o)) 
      { 
       CollectionHelpers.ReplaceCollection(collectionType, o, newContents); 
      } 
      return o; 
     } 
    } 

それが作成され、新たな要素があることはかなり明らかです。私はフラグの正確なロジックについてはっきりしていませんが、私はそれを今すぐ調査する時間がありません。ちなみに、BindComplexModelは、コレクション型の新しい要素を作成しているようです。

私は後でそれを分析しようとします。

+0

ご協力ありがとうございます。 – GONeale

+0

こんにちは、私はそこに何が起こっているのかを見るために同じルートをソースコードに従いました(私のドロップダウンリストでは多くの問題を抱えています。 リフレクターではどうしたのですか? MVCフレームワークでいくつかの呼び出しスタックを取得できるようになると便利でしょう。 – Jason

関連する問題