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

  • Mindy

    Mindy

    20 NİSAN 2006
  • Tahir Jahi

    Tahir Jahi

    6 Mart 2006
  • tseyina

    tseyina

    2 AĞUSTOS 2006