2014-03-03 10 views
0

.net mvc5에서 특정 규칙에 따라 속성을 바인딩 할 수 있습니까? 예를 들어, 시간 입력 (예 : 10.30)이 있고이를 이중으로 바인딩해야합니다. 하나의 속성을 바인딩하는 모델

그런 일이다 ... 내가 모델의 속성에 주석을 넣을 수 있도록

// Model 
[CustomAttribute("TimeAttr")] 
public double Hours { get; set; } 

// Binding 
public TimeAttrBinder : IModelBinder 
{ 
    // Replace colons with dots 
    return double.Parse(value.Replace(':', '.')); 
} 

// Global 
ModelBinders.add("TimeAttr", TimeAttrBinder) 

하고, 즉, 사용자 정의 모델 바인더 제본마다입니다 : 나는이의 라인을 따라 뭔가를 기대했다 .net mvc5에서 가능합니까?

답변

1

은 대한 기본 메커니즘 없습니다하지만 당신은이 문서에서와 같이 단지 주어진 속성에 대한 모델 바인더를 적용하는 사용자 정의 PropertyBinder 속성을 만들 수있다 : 그림과 같이 http://aboutcode.net/2011/03/12/mvc-property-binder.html

당신은 꽤 일반적인 만들 수 이 기사에서 개념을 설명하기 위해 이와 비슷한 것을 시도 할 수 있습니다.

메타인지 표식 속성 :

public class MyMarkerAttribute : Attribute, IMetadataAware 
{ 
    public void OnMetadataCreated(ModelMetadata metadata) 
    { 
     metadata.AdditionalValues["marker"] = true; 
    } 
} 

이 마커 속성 이해 사용자 정의 모델 바인더 :

public class MyModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     if (bindingContext.ModelMetadata.AdditionalValues.ContainsKey(MyMarkerAttribute.MarkerKey)) 
     { 
      var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
      if (value != null) 
      { 
       // Here you could implement whatever custom binding logic you need 
       // for your property from the binding context 
       return value.ConvertTo(typeof(double)); 
      } 
     } 

     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

을 다음 Application_Start에서 사용자 정의 하나의 기본 모델 바인더를 대체 :

ModelBinders.Binders.DefaultBinder = new MyModelBinder(); 

꽤 많이 있습니다. 이제 마커 속성을 사용하여 뷰 모델을 꾸밀 수 있습니다.

[MyMarker] 
public double Hours { get; set; } 
+0

감사합니다. – user3182508

관련 문제