Reliure de modèle personnalisée pour demande ASP.NET MVC sur GET

J’ai créé un classeur de modèle MVC personnalisé qui est appelé pour chaque HttpPost entrant sur le serveur. Mais ne pas être appelé pour les demandes HttpGet .

  • Mon classeur de modèle personnalisé doit-il être appelé pendant une opération GET ? Si oui, qu’est-ce que j’ai manqué?
  • Sinon, comment puis-je écrire du code personnalisé traitant le QuerySsortingng partir d’une demande GET ?

Voici ma mise en œuvre …

 public class CustomModelBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { // This only gets called for POST requests. But I need this code for GET requests. } } 

Global.asax

 protected void Application_Start() { ModelBinders.Binders.DefaultBinder = new CustomModelBinder(); //... } 

J’ai examiné ces solutions, mais elles ne fonctionnent pas vraiment pour ce que je recherche:

  • Persister des types complexes via TempData
  • Utilisation du classeur par défaut pour créer des types complexes ( ?Name=John&Surname=Doe )

Remarque sur la réponse

Merci à @Felipe pour l’aide. Juste au cas où quelqu’un lutterait avec la même chose, j’ai appris:

  • Le classeur de modèle personnalisé PEUT être utilisé pour GET demandes GET
  • Vous POUVEZ utiliser la classe DefaultModelBinder
  • Mon problème était que la méthode d’action DOIT avoir un paramètre (sinon, le classeur de modèle est ignoré pour GET requêtes GET , ce qui est logique lorsque vous y réfléchissez).

Supposons que vous ayez votre propre type que vous souhaitez lier.

 public class Person { public int Id { get; set; } public ssortingng Name { get; set; } public int Age { get; set; } // other properties you need } 

Vous pouvez créer une liaison de modèle personnalisée pour ce type spécifique, héritée de DefaultModelBinder , par exemple:

 public class PersonModelBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var request = controllerContext.HttpContext.Request; int id = Convert.ToInt32(request.QuerySsortingng["id"]); ssortingng name = request.QuerySsortingng["name"]; int age = Convert.ToInt32(request.QuerySsortingng["age"]); // other properties return new Person { Id = id, Name = name, Age = age }; } } 

Dans le fichier Global.asax de l’événement Application_Start , vous pouvez enregistrer cette liaison de modèle, par exemple:

 // for Person type, bind with the PersonModelBinder ModelBinders.Binders.Add(typeof(Person), new PersonModelBinder()); 

Dans la méthode BindModel de PersonModelBinder , vérifiez que vous avez tous les parameters dans la chaîne de requête et leur donnez le traitement idéal.

Depuis que vous avez cette méthode d’action:

 public ActionResult Test(Person person) { // process... } 

Vous pouvez accéder à cette action avec une URL ressemblant à ceci:

 Test?id=7&name=Niels&age=25