2011-02-16 2 views
3

이 문제가 있습니다. json을 사용하여 서버에 데이터를 보냅니다. 모든 잘 작동하지만 문제는 상황과 같은 : 내가 다시 서버로 보내json에서 enum (int에서 enum으로 customexception) Mvc 바인딩 문제

{"Sex" : 0} 

는이이 문제로 ModelStateError을 채우기 : 나에게 JSON을 만들

public enum SexType 
{ 
    Male : 0, 
    Female : 1 
} 

class People{ 
    public SexType Sex {get;set;} 
} 

매개 변수 'System.Int32'형식에서 'SexType'형식으로의 변환이 형식 변환기가 이러한 형식간에 변환 할 수 없기 때문에 실패했습니다. 내가 아니라 '모든 작업에 값을 래핑하는 경우

그러나 :

{"Sex" : '0'} 

사람은 같은 문제가?

모두를위한 Tnx!

답변

6

예, 동일한 문제가 있습니다. 이상한 문제는 다시 보낸 경우 :

{"Sex" : 'Male'} 

아무 문제가없는 것입니다. http://eliasbland.wordpress.com/2009/08/08/enumeration-model-binder-for-asp-net-mvc/

namespace yournamespace 
{ 
    /// <summary> 
    /// Generic Custom Model Binder used to properly interpret int representation of enum types from JSON deserialization, including default values 
    /// </summary> 
    /// <typeparam name="T">The enum type to apply this Custom Model Binder to</typeparam> 
    public class EnumBinder<T> : IModelBinder 
    { 
     private T DefaultValue { get; set; } 

     public EnumBinder(T defaultValue) 
     { 
      DefaultValue = defaultValue; 
     } 

     #region IModelBinder Members 
     public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      return bindingContext.ValueProvider.GetValue(bindingContext.ModelName) == null ? DefaultValue : GetEnumValue(DefaultValue, bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue); 
     } 
     #endregion 

     public static T GetEnumValue<T>(T defaultValue, string value) 
     { 
      T enumType = defaultValue; 

      if ((!String.IsNullOrEmpty(value)) && (Contains(typeof(T), value))) 
       enumType = (T)Enum.Parse(typeof(T), value, true); 

      return enumType; 
     } 

     public static bool Contains(Type enumType, string value) 
     { 
      return Enum.GetNames(enumType).Contains(value, StringComparer.OrdinalIgnoreCase); 
     } 
    } 
} 

다음의 Global.asax에서 모델 바인더 등록 : 문제를 해결하기 위해, 나는 (일부 오류가 있었다으로 약간 수정) 여기에있는 예제를 활용, 열거 형에 대한 사용자 정의 모델 바인더를 구현했습니다. cs. 더 빠른 방법이 있는지

ModelBinders.Binders.Add(typeof(SexType), new EnumBinder<SexType>(SexType.Male)); 

나는 잘 모르겠지만,이 위대한 작품 : 는 귀하의 경우에 그것은 뭔가 같은 것입니다.

2

모델 바인딩은 Enum.Parse() 메서드를 사용합니다. Enum.Parse() 메서드는 문자열 해석에 현명하지만 다른 형식을 문자열로 명시 적으로 변환하거나 변환하지 않습니다. 시스템 수준의 기능이 있어도 ' Enum 내에서 사용되는 내부 기억 장치 유형.

이것이 올바른 행동입니까? Enum 값을 문자열로 변환하기에 충분한 지식이 없으므로 Enum 값의 오른쪽이 Enum 내에서 반드시 고유하지는 않을 수도 있습니다.

섹스에 대한 개인적인 취향 (그리고 이것은 내가 너무 많은 통계 분석 프로그래밍을하기 때문에 또한 가능할 것입니다.) 나는 일반적으로 '남성'의 임의의 값을 구별하는 대신 명확한 부울 값으로 정의하는 것을 선호합니다. 'and'Female '나는 eg라는 변수를 사용합니다. IsFemale를 true 또는 false로 설정하십시오. 이것은 두 언어 모두에 공통적 인 기본 유형에 의존하기 때문에 json에서 더 잘 작동하며 사용하려고 할 때 타이핑을 덜 필요로합니다.