2011-09-20 1 views
11

모델ASP.Net MVC 3 바인딩 문자열 속성 사용자가 입력을 RuString의 값을 기입하지 않고 EnString가 null의 경우 String.Empty로 대신 널

public partial class BilingualString 
{ 
    public string RuString { get; set; } 
    public string EnString { get; set; } 
} 

public partial class Member 
{ 
    public Member() 
    { 
     this.DisplayName = new BilingualString(); 
    } 
    public BilingualString DisplayName { get; set; } 
} 

때문이다. 문자열이 필요합니다. null 대신 빈 문자열입니다. 이 같은

사용 CustomModelBinder :

public class EmptyStringModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     bindingContext.ModelMetadata.ConvertEmptyStringToNull = false; 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

도움이되지 않습니다.

답변

15

사용이 : 여기

[DisplayFormat(ConvertEmptyStringToNull=false)] 
    public string RuString { get; set; } 

또는

private string _RuString; 
    public string RuString { 
     get { 
      return this._RuString ?? ""; 
     } 
     set { 
      this._RuString = value ?? ""; 
     } 
    } 
+1

모든 문자열 필드를'[DisplayFormat (ConvertEmptyStringToNull = false)] '로 표시하지 않으려면 어떻게해야합니까? – AlexBBB

+1

유는 두 번째 방법을 사용할 수 있습니다 !!! –

+0

질문은 MVC 3에 null이 아닌 string.Empty로 빈 html 입력을 바인드하는 방법입니다 (MVC 1처럼). BilingualString은 사용자 정의 EmptyStringModelBinder가 트릭을 수행하지 않는다는 것을 보여주는 예입니다. – AlexBBB

2

오래된 질문하지만, 어쨌든 답변 :

문제는 ConvertEmptyStringToNull이 결합 모델에 설정되어있는 것 같다입니다 컨텍스트가 아니라 속성 바인딩 컨텍스트.

DefaultModelBinder 안에는 모델의 각 속성에 대해 BindProperty가 호출되며 문자열/소수 자릿수와 같은 간단한 개체가 BindModel을 호출 할 때까지 반복되지 않습니다.

운 좋게도 GetPropertyValue를 무시하고 컨텍스트에 옵션을 설정할 수 있습니다.

public class EmptyStringModelBinder : DefaultModelBinder 
{ 
    protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder) 
    { 
     bindingContext.ModelMetadata.ConvertEmptyStringToNull = false; 
     return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder); 
    } 
} 

나 : 근무

[편집] 바와 같이 ..이 모델 바인더 만 등록 된 경우 작동, 그래서 클래스를 추가 한 후, 호출해야합니다 의견에서 지적

ModelBinders.Binders.Add(typeof(string), new EmptyStringModelBinder()); 

Global.asax.cs의 Application_Start() 메소드

+1

이 작업을하려면 Application_Start()에'ModelBinders.Binders.Add (typeof (string), new EmptyStringModelBinder());를 추가해야합니다. 이 라인을 추가 한 후에도 저 또한 효과적이었습니다. – Manfred

+0

죄송합니다. 불행히도, 나는 OP 작성자의 질문에 이미 맞춤 바인더를 시도 했으므로이 작업을 수행 할 것을 알고 있다고 가정합니다. 다른 누구도 생각하지 않았다! – Mike