2013-01-20 2 views
5

양식이 내 컨트롤러 작업에 게시되고 양식이 내 모델에 바인딩되면 nullable double 및 decimal의 빈 양식 값은 기본적으로 0이지만 nullable int의 빈 양식 값은 기본적으로 null입니다. 이게 옳은 거니?모델 바인딩 - null 대신 Nullable decimal과 double의 기본값은 0입니까?

내 모델에 비어있을 수있는 여러 필드에 null 가능 유형이 있습니다. null 허용 int, double 및 decimal이 있습니다. 그런 다음 이러한 각 속성에 대한 텍스트 상자가있는 일반 양식이 있고 기본값은 공백 (빈 문자열)입니다. 이 양식이 모든 빈 양식 값으로 컨트롤러 작업에 다시 게시되고 내 모델에 바인딩되면 빈 복소수와 소수는 0으로 표시되고 빈 int는 null입니다.

빈 폼 값이 전달 될 때 모든 nullable 형식이 null로 기본 설정되어야하지만, 그렇지 않은 경우에도 두 배와 소수는 int와 다르게 취급됩니다.

+0

를 그냥 오프 기회에 : 당신은 당신의 모델을 인스턴스화 할 때, 전에 바인딩, nullable double과 decimal은 어떤 값을 가졌습니까? –

+0

코드를 게시 할 수 있다면 도움이 될 것입니다. –

답변

4

이 문제는 문제를 재현 할 수 없어 MVC4에서 해결 된 것으로 보입니다. 내 빈 텍스트 상자는 모두 null을 내 모델의 nullable int, double 또는 decimal에 바인드합니다. 문제 없음. 문제는 다른 곳에서 발생하거나 MVC3에서 버그로 사용되어 더 이상 존재하지 않을 수 있습니다.

그렇다면 여전히 문제가 발생하여 MVC4를 사용할 수 없다면 자신 만의 맞춤 모델 바인더로 수행해야하는 작업을 정확하게 수행해보십시오. 여기에 소수점을 위해 예를 하나 :

public class NullableDecimalBinder : IModelBinder { 

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { 
     ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     ModelState modelState = new ModelState { Value = valueResult }; 
     object result = null; 

     if (valueResult.AttemptedValue.Length > 0) { 
      try { 
       // Bonus points: This will bind using the user's current culture. 
       result = Convert.ToDecimal(valueResult.AttemptedValue, System.Globalization.CultureInfo.CurrentCulture); 
      } catch (FormatException e) { 
       modelState.Errors.Add(e); 
      } catch (InvalidOperationException e) { 
       modelState.Errors.Add(e); 
      } 
     } 

     bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
     return result; 
    } 
} 

을 그리고, 그것을 사용하는, 당신의 Global.asax의 Application_Start이 줄을 추가 :

ModelBinders.Binders.Add(typeof(decimal?), new NullableDecimalBinder());