2009-07-30 15 views
6

Bu konuda hiç şansı olan var mı?ASP.NET MVC'de UpdateModel üzerinde çalışan IncludeProperties'i göremiyor gibi görünüyor

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

Should bu SADECE güncelleme: Ben gerçekleştirmek

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

ve sonra:

beni ben basit bir model varsa ile diyelim ki, doğru anlamak eğer bildirin isim ve detay özellikleri? Çünkü db'den 'yaratılmış' bir tarih var diyelim, yukarıda yaptığım zaman, yarattığım tarih 01-01-0001 'e orijinalinden ayarlanmış gibi görünüyor. Sonra açık bir şekilde belirtilen bu alanı hariç çalıştığınızda

Üstelik:

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

Hala 01-01-0001 ayarlı ediliyor. Bu bir hata mı, yoksa yanlış yaptığım garip bir şey mi?

Etkin olarak yapmak istediğim, ilgili form alanları için olan ancak yalnızca geri kalanını db getirme işleminden ayarlanan ve bunları geçersiz veya varsayılan olmayan Şu anda yaptığı gibi görünüyor.

Yine de, yukarıdaki ile gerçek dünya senaryom arasındaki tek farkın bir listede updateModel kullanıyorum, bu yüzden listFromDb (parentId) öğesini etkin bir şekilde alıyorum ve sonra updateModel (myList, "ListPrefix") uygulayarak söylüyorum. her bir öğeyi [0], [1] vs ile alır. Tüm isimler güncellendiği için çalışır, ancak her şey işe yaramıyor.

Güncelleme: Muhtemelen fark ettim ki, 'includeProperties', bağlama nasıl çalıştığına benzer biçimde, formda içermek istediğiniz özellikleri tanımlamaktır. Bu durumda * ise, bunun yerine sadece modelinin model özelliklerini güncellemesini nasıl söyleyebilirim?

cevap

1

Bunu kullanarak Reflektör içine bakıyordum ... çağrı yığını geçerli:

UpdateModel() ->TryUpdateModel() ->DefaultModelBinder.BindModel() ---> ya BindComplexModel() veya 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; 
     } 
    } 

Bu yeni kurulmakta unsurlar olduğunu çok açık:

İşte BindSimpleModel() için sökme bu. Bayrakların kesin mantığıyla ilgili olarak belirsiz değilim ve şu an daha fazla araştırma yapmak için zamanım yok. Bu arada, BindComplexModel, koleksiyon türleri için yeni öğeler yaratıyor gibi görünüyor.

Daha sonra analiz etmeye çalışacağım.

+0

Yardımlarınız için teşekkürler womp. – GONeale

+0

Merhaba, içeride neler olup bittiğini görmek için kaynak kodu takip edildikten sonra aşağıya inmiştim (dropdownlists'imle bazen çok fazla sorun yaşadığım için seçim listesi nereden geliyor?). Bunu Reflektör'de nasıl yaptınız? MVC çerçevesinde birkaç şey için çağrı yığını elde edebilmek için yararlı olacaktır. – Jason

İlgili konular