SORU
18 Mayıs 2011, ÇARŞAMBA


Model ASP.NET MVC 3 Çeteleler Bağlama

Bağımsız değişken olarak bir nesne kabul eden benim denetleyicisi JsonResult bir yöntem var. Bu nesne özellikleri üzerine bir üç olası değerleri ile bir numaralama. Sanıyorum o zaman müşteri geçirilen bir int için bu özelliği olurdu doldurmak numaralama, ama değil, varsayılan olarak 0 ve numaralama belirlemek için ilk şey Olası seçimler.

Herhangi bir öneriniz var mı?

CEVAP
23 Mayıs 2011, PAZARTESİ


NOT: Bu MVC 4'te giderilmiştir. Eğer MVC 4'e yükseltme projesi için uygun bir seçenek ise, o zaman bu model bağlama :D numaralamalar için başlamak için tüm yapmanız gereken

O, burada, Eğer hala ihtiyacınız var mı MVC 3 için çözüm olduğunu söyledi.

Sorun MVC varsayılan model binder. Doğru tamsayı değeri model binder yapar ama cildin numaralama tamsayı değeri için harita kodlanmıştır. Doğru ise değeri geçirilen bir dize ise numaralama belirtilen değeri içeren bağlar. Bu sorunu bir C ayrıştırılamadı# JSON nesnesi numaralandırma değeri bir tamsayı değeri gönderir Json() yöntemini kullanarak adlandırılmış bir değer değil.

Bu ve en şeffaf en kolay düzeltme varsayılan model bağlayıcı geçersiz kılmak ve bazı özel mantık çeteleler bağlar yolu düzeltmek için yazmaktır.

  1. Yeni bir sınıf, bu yüzden oluşturun.

    namespace CustomModelBinders
    {
        /// <summary>
        /// Override for DefaultModelBinder in order to implement fixes to its behavior.
        /// This model binder inherits from the default model binder. All this does is override the default one,
        /// check if the property is an enum, if so then use custom binding logic to correctly map the enum. If not,
        /// we simply invoke the base model binder (DefaultModelBinder) and let it continue binding as normal.
        /// </summary>
        public class EnumModelBinder : DefaultModelBinder
        {
            /// <summary>
            /// Fix for the default model binder's failure to decode enum types when binding to JSON.
            /// </summary>
            protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext,
                PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
            {
                var propertyType = propertyDescriptor.PropertyType;
                if (propertyType.IsEnum)
                {
                    var providerValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
                    if (null != providerValue)
                    {
                        var value = providerValue.RawValue;
                        if (null != value)
                        {
                            var valueType = value.GetType();
                            if (!valueType.IsEnum)
                            {
                                return Enum.ToObject(propertyType, value);
                            }
                        }
                    }
                }
                return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
            }
        }
    }
    
  2. Sonra sadece Küresel kaydettirin.dosya asax.

    protected override void OnApplicationStarted()
    {
        base.OnApplicationStarted();
    
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);
    
        // Register your new model binder
        ModelBinders.Binders.DefaultBinder = new EnumModelBinder();
    }
    

İşte bu kadar. Çeteleler şimdi doğru JSON nesneler üzerinde bağlı olacaktır.

http://www.codetunnel.com/how-to-bind-to-enums-on-json-objects-in-aspnet-mvc-3

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andytokkallos

    Andytokkallo

    27 Kasım 2007
  • DanceOn

    DanceOn

    6 Mayıs 2006
  • theatre2film

    theatre2film

    12 NİSAN 2006