2011-03-09 33 views
15

'daki ModelMetadataProvider'dan gelen nesne örneğini ASP.NET MVC2'ye özel DataAnnotationsModelMetadataProvider uygulayarak edinin. işlenmiş olan nesne varsayarak ASP.NET MVC

aşağıdaki gibidir:

- Contact : IUpdateable 
    - Name: string 
    - ContactType: (Lead, Prospect, Customer) 

ve aşağıdaki yöntem anlamına Contact.ContactType bağlamında olduğu:

  • meta.PropertyName == "ContactType"
  • meta.ContainerType == typeof(Contact)
  • meta.Model == ContactType.Lead

(soru :) altında kod

protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, 
    Type containerType, 
    Func<object> modelAccessor, 
    Type modelType, string propertyName) { 

    var containerInstance = meta.NotSureWhatGoesHere as IUpdateable; 
    meta.IsReadOnly = containerInstance != null && containerInstance.CanBeUpdated(meta.PropertyName); 
} 

soru: Nasıl meta verilerinden tokuşu örneğini elde edebilirsiniz? (NotSureWhatGoesHere'u doğru olanla değiştirin)?

Teşekkürler.

cevap

11

kirli yöntem:

object target = modelAccessor.Target; 
object container = target.GetType().GetField("container").GetValue(target); 

Bu modelin yerine model.Contact ait => model.Contact.Name modeli dönecektir. Kalan okuyucuya bir egzersiz olarak bırakılır;). Bu yöntem, tüm yansıma tabanlı çözümlerin, halka açık olmayan verilerde, garanti vermeden dolaştığından gelir.

+0

Bu ilginç bir oyun! Daha sonra bir atış verecektir. Teşekkürler. –

+1

Bundan daha karmaşık görünüyor. Bir İfade ağacını geçmek (ve bir parçasını derlemek) ve metada sahip olduğum bilgilere dayanarak kapsayıcıyı bulmanız gerekecektir. Meta, gerekli kapsayıcı örneğini tanımlayabilen kapsayıcı örneği hakkında herhangi bir bilgi sağlamaz (ContainerName ve türü, çoğunu olabildiğince yapmak için yeterli değildir). –

+0

Bu benim için çalıştı. –

0

modelAccessor parametresi nedir?

Dene:

var containerInstance = modelAccessor() as IUpdateable; 
+0

Hayır, "ContactType.Lead" kapsamındadır. modelAccessor() ', bu durumda meta.Model ile aynı şeyi döndürür; tek fark, "modelAccessor", null ise kodunuzun başarısız olmasıdır, ancak meta.Model "null değerini döndürür. –

2

ben yapabilirsiniz sanmıyorum. I asked Brad Wilson (author of ModelMetadata, et. al.) about this directly, and he couldn't come up with a way. Sonunda farklı bir rotaya gitmem gerekti. (MVC3 test)

+0

Çok teşekkürler. Çok hayal kırıklığı yaratıyor. Bu konuda MVC2'den MVC3'e bir şey değiştiğini biliyor musunuz? –

+0

@Dmytrii, Henüz MVC 3'te buna bakmadım. –

+0

Bu, MVC3 veya MVC4'te değişmiş gibi görünmüyor. 'CreateMetadata' yöntemi hala örneği değil, yalnızca Container Type’i geçirir. –