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); 
     } 

Проблема заключается в том, что для каждого свойства, и есть куча, мне нужно сделать весь блок попытаться поймать.

Что я думал, что я могу сделать, это создать метод расширения, который будет делать весь блок для меня, и все, что мне нужно будет передать, это свойство модели и перечисление.

Так что я мог бы что-то сделать;

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, а не попробовать поймать блок. Это улучшит производительность и, вероятно, приведет к получению более читаемого кода.

+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! Добавлено в то же время. Тем не менее, проверьте Enum.IsDefined, если вы хотите избавиться от блока try/catch. – Mac