6

これで運が良かった人はいますか?

正しく理解しているかどうか教えてください。単純なモデルがある場合は、次のように言いましょう。

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" });

これは、名前と詳細のプロパティのみを更新する必要がありますか? 'created' に db からの日付が既にあったとしましょう。上記を実行すると、作成日が元の 01-01-0001 に設定されているように見えます。

さらに、このフィールドを明示的に除外しようとすると、次のようになります。

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

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

私が実際にやりたいことは、対応するフォームフィールドがあるモデルプロパティを更新することですが、db fetch だけで設定された残りのものはそのままにして、null またはデフォルトに設定しないでください。やっているようです。

ただし、おそらく上記と私の実際のシナリオの唯一の違いは、リストで updateModel を使用しているため、効果的に listFromDb(parentId) を取得し、選択したものに updateModel(myList, "ListPrefix") を適用していることです。各項目を[0]、[1]などで上げます...すべての名前が更新されているため機能しますが、他のすべてはそうではありません。

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

4

1 に答える 1

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 は、コレクション型の新しい要素を作成しているように見えるという点で似ています。

後でもっと分析しようと思います。

于 2009-07-30T18:36:22.847 に答える