2009-02-25 35 views
2

Düzenli bir Boole nesnesine dönüştürülebilen S2kBool adlı özel bir nesnem var. Temel olarak, benim uygulamamın eski veritabanımdaki boolean değerlerini C# booleanlarını ele aldığı şekilde ele almasını sağlar. Sonra sorun, S2kBool özelliğinin değerini ayarlamak için bir onay kutusunu kullanmaya çalıştığımda başarısız olur.UpdateModel, bir boolean değerini düzgün şekilde dönüştürmez

public class MyClass { 
    public S2kBool MyProperty { get; set; } 
} 

MyClassInstance.MyProperty = true; 

Ama UpdateModel yerine bir bool dönüştürülebilir bir nesne yerine, gerçek bir bool türü bekliyor neredeyse gibi: Böyle

Kod çalışır. Bununla birlikte, gerçekten atıfta bulunulan istisnanın bu kadar belirsiz olduğunu söyleyemem:

Model başarıyla güncellenemedi.

Bu konuya nasıl girebilirim? Özel ModelBinder'e mi ihtiyacım var?

Teşekkürler!

cevap

2

Charlino'nun çözümü zekice ve işe yarayacak olsa da, kişisel olarak, bu amaç için alan varlıklarımı ekstra bir özellik ile "kirletme" fikrini istemem. Bence şu ana kadar bir cevap buldun: özel bir model oluşturucu. Bir şey gibi:

public class S2kBoolAttribute : CustomModelBinderAttribute, IModelBinder 
{ 
    public override IModelBinder GetBinder() 
    { 
     return this; 
    } 

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     ValueProviderResult result; 
     return bindingContext.ValueProvider.TryGetValue(bindingContext.ModelName, out result) 
      ? (S2kBool)result.ConvertTo(typeof(bool)) 
      : null; 
    } 
} 

Ve sonra şöyle görünecek şekilde denetleyici eylemini değiştirebilirsiniz: Eğer bunu bağlayıcı küresel varlık ile çalışmak alabilir ModelBinder içine biraz daha fazla iş koyarsanız

public ActionResult Foo([S2kBool]S2kBool myProperty){ 
    myClassInstance.MyProperty = myProperty; 
    SaveToLegacyDb(myClassInstance); 
    return RedirectToAction("Bar"); 
} 

kayıtlı - ama yukarıda verdiğim uygulama, gerektiğinde kiraz toplama değerlerine göre çalışmalıdır.

+0

S2kBool türünde bir özelliği başka bir model ciltleyiciyle birleştirmek istemediğinizi varsayarak, özel bağlayıcıyı, bu türdeki global.asax uygulama başlangıç ​​olayındaki koleksiyona eklemekten ziyade bağlama özniteliklerini kullanmak yerine eklerim. kendisi. –

+0

Genel model bağlayıcıyı global.asax içine ekleyerek, tüm S2kBool özelliklerine otomatik olarak uygulanacak mı? Örneğin, yukarıda verdiğim kodda, veriyi MyClass'a bağlamaya çalışıyor olsaydım, model bağlayıcım MyClass.MyProperty için geçerli olur mu, yoksa yalnızca yöntem bağımsız değişkenleri üzerinde mi çalışır? –

2

S2kBool özelliğinizin değeri değiştiğinde, bool özellikli bir boole özelliğine sahip olabilirsiniz.

public class MyClass { 
    public S2kBool MyProperty { get; set; } 
    public bool MyPropertyBool { 
     get 
     { 
      return (bool)MyProperty; 
     } 
     set 
     { 
      MyProperty = value; 
     } 
    } 
} 

Ardından sadece html biçiminde MyPropertyBool ve ModelBinder onun tür hakkında kafayı olmayacaktır.

Ben Parola ModelBinder o zaman veritabanı veya neye kalıcıdır bunun karma HashedPassword ayarlar için ve Şifrenizi en setter bağlandığını html formundan özelliktir Şifre & HashedPassword gibi özellikler için bu tekniği kullanmak hiç.

İlgili konular