Связыватель модели ASP.NET MVC для универсального типа

Можно ли создать связыватель модели для универсального типа? Например, если у меня есть тип

public class MyType<T>

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

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


person Nathan Roe    schedule 28.09.2009    source источник


Ответы (1)


Создайте привязку модели, переопределите 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;
    }
person Anthony Johnston    schedule 28.09.2009
comment
Поскольку этот вопрос по-прежнему занимает довольно высокое место в результатах Google, я хотел бы упомянуть, что, возможно, лучшим решением, появившимся с MVC3, является использование Провайдеры связывания моделей. Это делает так, что вам не нужно заменять привязку по умолчанию, если все, что вы делаете, это пытаетесь добавить специальные правила для привязки определенного типа, что делает привязку пользовательской модели гораздо более масштабируемой. - person DMac the Destroyer; 27.09.2011
comment
Я изо всех сил пытался найти, как настроить привязку пользовательской модели для всех типов в приложении mvc 2. И вот решение! Большое спасибо! - person blazkovicz; 16.02.2012