2010-04-16 3 views
2

나는 이와 같은 모델을 가지고 있습니다.ValueProvider.GetValue 확장 메서드

public class QuickQuote 
{ 
    [Required] 
    public Enumerations.AUSTRALIA_STATES state { get; set; } 

    [Required] 
    public Enumerations.FAMILY_TYPE familyType { get; set; } 

두 가지 특성은 열거 형임을 알 수 있습니다.

이제는 내 자신의 모델 바인더를 사용하여 그 순간에 들어 가지 않도록 할 생각입니다.

public class QuickQuoteBinder : DefaultModelBinder 
{ 

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     quickQuote = new QuickQuote(); 

     try 
     { 
      quickQuote.state = (Enumerations.AUSTRALIA_STATES) 
       Enum.Parse(typeof(Enumerations.AUSTRALIA_STATES), 
       bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".state").AttemptedValue); 
     } 
     catch { 
      ModelState modelState = new ModelState(); 
      ModelError err = new ModelError("Required"); 
      modelState.Errors.Add(err); 
      bindingContext.ModelState.Add(bindingContext.ModelName + ".state", modelState); 
     } 

문제는 각 속성에 대해 힙이 있기 때문에 전체 try catch 블록을 수행해야한다는 것입니다.

내가 할 수 있다고 생각한 것은 나를 위해 전체 블록을 처리 할 확장 메서드를 만드는 것이고 모델 속성과 열거 형을 전달해야합니다.

나는 이렇게 할 수있다;

quickQuote.state = bindingContext.ValueProvider.GetModelValue("state", ...)

이 가능합니까?

답변

1

예 확장 방법을 사용할 수 있습니다. 어떻게 작성하는지 보여주는 간단한 예가 있습니다.

public static class Extensions 
{ 
    public static ValueProviderResult GetModel(this IValueProvider valueProvider, string key) 
    { 
     return valueProvider.GetValue(key); 

    } 
} 

다른 생각은 Enum.IsDefined를 try catch 블록 대신 사용하는 것입니다. 그것은 성능을 향상시키고 더 읽기 쉬운 코드가 될 것입니다.

+0

+1 나는 그것을 매우 감사한다. – griegs

+0

나는 내 자신을 답으로 표시 할 수는 없지만 당신의 것이 너무 좋다 ... – griegs

0

괜찮아. 알았어.

public static class TryGetValueHelper 
{ 
    public static TEnum TryGetValue<TEnum>(this ModelBindingContext context, string property) 
    { 
     try 
     { 
      TEnum propertyValue = (TEnum)Enum.Parse(typeof(TEnum), context.ValueProvider.GetValue(property).AttemptedValue); 
      return propertyValue; 
     } 
     catch { 
      ModelState modelState = new ModelState(); 
      ModelError modelError = new ModelError("Required"); 
      modelState.Errors.Add(modelError); 
      context.ModelState.Add(context.ModelName + "." + property, modelState); 
     } 

     return default(TEnum); 

    } 
} 
+0

D' oh! 동시에 게시됩니다. 그래도 try/catch 블록을 제거하려면 Enum.IsDefined를 확인하십시오. – Mac