2009-09-28 4 views
19

Возможно ли создать модельное связующее для универсального типа? Например, если у меня есть типASP.NET MVC Model Binder для общего типа

public class MyType<T> 

Есть ли способ, чтобы создать пользовательскую модель связующие, которая будет работать для любого типа MyType?

Спасибо, Натан

ответ

25

Создать ModelBinder, переопределить BindModel, проверьте тип и делать то, что вам нужно сделать

public class MyModelBinder 
    : DefaultModelBinder { 

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { 

     if (HasGenericTypeBase(bindingContext.ModelType, typeof(MyType<>)) { 
      // do your thing 
     } 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

Установите модель связующего до значения по умолчанию в global.asax

protected void Application_Start() { 

     // Model Binder for My Type 
     ModelBinders.Binders.DefaultBinder = new MyModelBinder(); 
    } 

проверяет соответствие родовых баз

private bool HasGenericTypeBase(Type type, Type genericType) 
    { 
     while (type != typeof(object)) 
     { 
      if (type.IsGenericType && type.GetGenericTypeDefinition() == genericType) return true; 
      type = type.BaseType; 
     } 

     return false; 
    } 
+16

Поскольку этот вопрос по-прежнему очень высок в результатах Google, я хотел бы упомянуть, что, возможно, лучшим решением, которое вышло с MVC3, является использование [Поставщики привязки модели] (http://bradwilson.typepad.com/ блог/2010/10/сервис определения местоположения pt9-модель-binders.html). Это означает, что вам не нужно заменять связующее по умолчанию, если все, что вы делаете, пытается добавить специальные правила для привязки типа _particular_, что делает привязку пользовательской модели гораздо более масштабируемой. –

+0

Я пытался найти, как установить пользовательское связующее устройство для всех типов в приложении mvc 2. И вот решение! Большое спасибо! – blazkovicz