2010-04-16 165 views
2

我有這樣的模型;ValueProvider.GetValue擴展方法

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

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

正如你可以看到兩個proerties是枚舉。

現在我想僱用我自己的模型活頁夾,原因是我暫時不打算進入。

所以我有;

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 2010-04-16 05:43:02

+0

我不能將自己標記爲答案,但你的答案非常好,所以...... – griegs 2010-04-16 05:44:45

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 2010-04-16 05:04:45