2009-06-09 32 views
36

var Bağlama.ASP.NET MVC Karıştırma Özel ve Standart Modeli Bir tür

Bir Range nesnesini döndürmek için varsayılan model bağlayıcıyı çağırmak için özel model ciltleyicimden bir yol var mı? Ben sadece ModelBindingContext'i doğru bir şekilde kurmam gerektiğini düşünüyorum, ama nasıl olduğunu bilmiyorum. İlk açıklama ve cevap baktığımızda DÜZENLEME


- yararlı olabilir varsayılan model bağlayıcı devralan gibi görünüyor.

şimdiye kadar ben benim kurulum için daha ayrıntılı bilgileri eklemek için:

public IssueFormModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     Order = //code to pull the OrderNumber from the context and create an Order 
     Item = //code to pull the ItemNumber from the context and create an Item 

     IssueForm form = IssueFormFactory.Create(Order, Item); 

     form.Range = // ** I'd like to replace my code with a call to the default binder ** 

     return form 
    } 
} 

Bu bunu yapmanın bir aptal yol olabilir ... Bu benim ilk modeli bağlayıcıdır. Sadece şu anki uygulamamı işaret ediyor. Yani cevaplar


DÜZENLEME 2.

ben gibi "Bütün bağlayıcı bıktım" yöntem haline kanca ve özelliklere sahip Fabrika yöntemini çağırabilirsiniz eğer BindProperty çalışacaktır geçersiz kılmak için.

Gerçekten DefaultModelBinder uygulamasına bakıp aptallıktan çıkmam gerektiğini düşünüyorum. DefaultModelBinder gelen

public class CustomModelBinder : DefaultModelBinder { 
    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) { 
     if(propertyDescriptor.Name == "Order") { 
      ... 
      return; 
     } 

     if(propertyDescriptor.Name == "Item") { 
      ... 
      return; 
     } 

     base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
    } 

} 
+1

En zarif çözüm olup olmadığından emin değilim, ancak özel model bağlayıcıyı IModelBinder uygulamasından ziyade DefaultModelBinder'dan türetebilir misiniz? Daha sonra BindModel'i geçersiz kıldığınızda, sorumluluğu uygun olduğunda DefaultModelBinder'a iletin. Aksi halde, özel ciltleme kullanın. –

+0

Yah, IModelBinder ve DefaultModelBinder öğelerinden bazı model bağlayıcılar çıktığını görüyorum. DefaultModelBinder'ın BindModel yönteminden çağrı aldığını düşündüğüm birkaç yöntemi vardır, bu sayede gereksinimlerinizi daha fazla odaklayabilirsiniz? – anonymous

+0

Sadece ModelBinder'i göz ardı etme ve kod giriş işlemlerini ve doğrulama işlemlerini el ile yapma kararımı onaylıyor. Şimdi tutarlı ve şeffaf, geleceğe dönük ve gelecekteki ihtiyaçlarını karşılayabiliyorum. – User

cevap

24

Böyle bir şey deneyin

public class CustomModelBinder:DefaultModelBinder 
     { 
      protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor) 
      { 
       if (propertyDescriptor.PropertyType == typeof(Range)) 
       { 
        base.BindProperty(controllerContext, bindingContext, propertyDescriptor); 
       } 
       // bind the other properties here 
      } 
     } 
+0

Muhtemelen aptallık yapıyorum, ancak bunun çalışması için bir yerde somutlaştırılması gereken CustomModelBinder sınıfını nasıl uygularız? Belki ActionResult paramlarında bir özellik olarak? Ad yerine inspedcting özellik türü için –

49

kılma BindProperty:

+20

+1. Blame magic dizeleri! –

6

Ben iki farklı özel model bağlayıcılar, Sipariş diğeri Öğe için bir tane kayıtlı düşünüyorum, ve varsayılan model birleştiricinin Aralığı ve IssueForm'u işlemesine izin verin.

+4

Evet, bu soruyu sorduğumdan beri biraz zaman geçti. DefaultModelBinder koduna bakmayı ve modelin bağlayıcılığının yinelemeli doğasını gerçekleştirmeyi bitirdim. Her biri için ayrı ayrı bir model bağlayıcısı tanımlayabildiğim diğer karmaşık türleri içeren karmaşık bir türle farketmedim. Bunun yerine karmaşık ebeveynin her karmaşık çocuğun ayrıntılarını bilmesi gerektiğini düşündüm. – anonymous