Je comprends qu'un ModelBinder est un bon endroit pour faire le travail sur la demande afin que vous gardiez ce type de code hors du contrôleur. Travailler avec des valeurs de formulaire serait un exemple. Cela semble logique cependant, j'ai hérité d'une application qui utilise un classeur personnalisé et je n'arrive pas à comprendre comment et pourquoi cela fonctionne.Je ne "reçois" pas ModelBinders dans MVC 2
Le liant lui-même existe pour traiter seulement TimeZoneInfo objets qu'ils (fuseaux horaires) sont utilisés dans l'application il est inscrit dans la méthode Application_Start dans le monde comme si:
binders.Add(new System.Collections.Generic.KeyValuePair<Type, IModelBinder>(typeof(TimeZoneInfo), new TimeZoneInfoModelBinder()));
de liants est de tapez ModelBinderDictionary. Le liant lui-même ressemble alors à ceci:
public class TimeZoneInfoModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException("bindingContext");
}
string tzId = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue;
try
{
return TimeZoneInfo.FindSystemTimeZoneById(tzId);
}
catch (Exception ex)
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName, ex);
}
return null;
}
}
maintenant de marcher à travers le code, je sais ce classeur est seulement appelé quand je POST données au serveur qui implique un modèle particulier qui a une propriété TimeZoneInfo sur elle. Mes hypothèses sont les suivantes:
- Le temps d'exécution « sait » sur tous les modèles et n'Invoque le liant personnalisé lorsqu'il trouve une propriété avec le même type que celui qui a été adoptée pour le liant.
- La raison pour laquelle cela est fait parce que le type TimeZoneInfo est un type complexe et, par conséquent, ne peut pas être converti implicitement à partir d'une chaîne (données POST)
Est-ce une bonne compréhension de ce particulier par exemple ou ai-je oublié quelque chose?
Merci!
Merci pour l'explication Rob. – dparsons