2010-05-20 3 views
2

Comment puis-je intercepter une entrée de formulaire soumise et la modifier avant qu'elle ne soit liée à mon modèle? Par exemple, si je voulais couper les espaces de tout le texte.Comment puis-je modifier l'entrée avant la liaison du modèle dans asp.net mvc?

J'ai essayé de créer un liant modèle personnalisé comme ceci:

public class CustomBinder : DefaultModelBinder { 

    protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value) { 
    string newValue = ((string)value).Trim(); //example code to create new value but could be anything 
    base.SetProperty(controllerContext, bindingContext, propertyDescriptor, newValue); 
    } 

} 

mais cela ne semble pas être invoqué. Y a-t-il un meilleur endroit pour modifier la valeur d'entrée?

Remarque: J'ai besoin de modifier la valeur avant qu'elle ne soit liée et validée.

Répondre

1

Avez-vous vérifié que votre modèle de liant était utilisé? Par exemple. le liant modèle par défaut peut être remplacé en faisant cela dans Application_Start:

ModelBinders.Binders.DefaultBinder = new MyVeryOwnModelBinder(); 

Je l'ai fait avec succès ce à plusieurs reprises, l'application d'une opération de ré-indexation à un tableau POSTées.

J'ai effectué la réindexation en remplaçant la méthode BindModel, en recherchant les valeurs affichées dans le dictionnaire bindingContext.ValueProvider.

Il devrait être possible de modifier ce dictionnaire afin de modifier les valeurs POST avant la liaison du modèle.

+0

Si je remplace 'BindModel' alors je peux voir mon CustomBinder est invoqué par le débogueur mais quand je viens de surcharger 'GetProperty' ce n'est pas le cas. –

+0

Arghhh! J'enregistrais mon classeur modèle contre le type de propriété en utilisant 'ModelBinders.Binders.Add()' et non comme le classeur modèle par défaut. Utiliser 'ModelBinders.Binders.DefaultBinder = new CustomBinder();' appelle 'SetPoperty' comme prévu. –

0

Avez-vous enregistré le modèle de classeur dans global.asax?

+0

Oui, et si je remplace 'BindModel' alors je peux voir qu'il est invoqué par le débogueur mais pas quand je remplace SetProperty' –

Questions connexes