2011-04-03 103 views
7

我有一個自定義的結構稱爲TimeOfDay這是在視圖模型中使用這樣的:當類型爲空不叫自定義模型綁定

public class MyViewModel 
{ 
    public TimeOfDay TimeOfDay { get; set; } 
} 

我創建了一個自定義模型粘合劑稱爲TimeOfDayModelBinder並在全球註冊它.asax.cs是這樣的:

ModelBinders.Binders.Add(typeof(TimeOfDay), new TimeOfDayModelBinder()); 

而且一切都很好。但是,如果我將視圖模型更改爲:

public class MyViewModel 
{ 
    public TimeOfDay? TimeOfDay { get; set; } // Now nullable! 
} 

我的自定義模型聯編程序不再被調用。我知道這個屬性不再是TimeOfDay的一種類型,而是一個不同的Nullable。那麼,這是否意味着我應該兩次加我的自定義模型粘合劑在Global.asax.cs中是這樣的:

ModelBinders.Binders.Add(typeof(TimeOfDay), new TimeOfDayModelBinder()); 
ModelBinders.Binders.Add(typeof(TimeOfDay?), new TimeOfDayModelBinder()); 

它的工作原理,但這裏還有一些我不喜歡它。這是真的有必要處理我的類型爲空,或者有什麼我失蹤?

+0

我不認爲你錯過了什麼。據我所知,這是做這件事的標準方式。 – LukeH 2011-04-03 23:35:45

+0

你有沒有想過這個?我有一個類似(但不完全)的問題。請參閱[我的問題](http://stackoverflow.com/questions/5519548/)。 – notJim 2011-04-04 19:43:29

+0

@notJim我沒有深入研究,但結論是我需要添加模型綁定器兩次。一次是不可空的,一次是可空的,因爲它實際上是CLR的兩種不同類型。 – 2011-04-07 15:52:59

回答

1

根據@盧克的評論,這似乎是必要的。我想這也是有道理的,因爲TimeOfDayNullable<TimeOfDay>在CLR中確實是兩種不同的類型。所以我想我必須忍受它。 :-)

7

這不是您的問題的答案,而是一種替代解決方案。有可能是更好的...

在MVC3中,您可以創建一個IModelBinderProvider。一個實現將是這樣的:

public class TimeOfDayModelBinderProvider : IModelBinderProvider 
{ 
    public IModelBinder GetBinder(Type modelType) 
    { 
      if(modelType == typeof(TimeOfDay) || modelType == typeof(TimeOfDay?)) 
      { 
       return new TimeOfDayModelBinder(); 
      } 
      return null; 
    } 
} 

你需要註冊它在你的DependencyResolver/IOC容器做到這一點(在Global.asax - 應用程序啓動):

ModelBinderProviders.BinderProviders.Add(new TimeOfDayModelBinderProvider()); 
+0

+1有趣並且很高興知道。但就我而言,我認爲這會使問題複雜化,而不是簡化它。不過謝謝你。 :-) – 2011-04-04 00:16:26