Пользовательское связующее модель не вызывается, когда тип обнуляется - PullRequest
7 голосов
/ 04 апреля 2011

У меня есть пользовательская структура с именем TimeOfDay, которая используется в такой модели представления:

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

Я создал пользовательский механизм связывания модели с именем TimeOfDayModelBinder и зарегистрировал его в Global.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());

Это работает, но есть кое-что, что мне не нравится в этом.Это действительно необходимо для того, чтобы считать мой тип обнуляемым, или я что-то упустил?

Ответы [ 2 ]

8 голосов
/ 04 апреля 2011

Это на самом деле не ответ на ваш вопрос, а альтернативное решение. Там может быть лучше ...

В 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());
1 голос
/ 20 апреля 2011

За @ комментарий ЛукиХ, кажется, это необходимо. Я думаю, это тоже имеет смысл, поскольку TimeOfDay и Nullable<TimeOfDay> на самом деле два разных типа в CLR. Так что, думаю, мне придется с этим смириться. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...