ASP.Net Model Binder fail – It is not a bug, it’s a feature

Un petit truc rigolo toujours présent dans ASP.Net MVC 5:

quand on nomme une propriété d’un objet complexe exactement comme on nomme cet objet quand il est argument d’une action, le ModelBinder se vautre et on se retrouve avec null en paramètre de l’action.

On voit pourquoi ci-dessous

ModelBinder01

Quel est le problème?

Prenons un objet de type complexe, nommé MessageViewModel:

ModelBinder01Nous l’utilisons dans un controller MVC ainsi:

ModelBinder02

Ce qui se passe dès lors: dès qu’on POSTe un MessageViewModel, on se retrouve avec null en argument de l’action Create… 😮

Pourquoi?

Ce qu’il faut noter:

  • l’objet de type MessageViewModel comporte une propriété « Message »
  • l’objet de type MessageViewModel en argument de l’action MVC, est nommé « message »

Si l’on renomme l’un des deux, ça fonctionne. Le ModelBinding est de nouveau opérant.

Pourquoi?

Le problème provient du fait que le ModelBinder essaie de matcher, et vous devez le savoir, les propriétés de l’objet argument par rapport aux noms fournis dans la requête POST.

Vous l’avez peut être déjà utilisé aussi comme cela: il est possible de passer directement les paramètres en arguments de l’action plutôt qu’encapsulées dans un type complexe. Donc le ModelBinder est aussi capable de faire des matchings de nommage entre les paramètres de requêtes et les arguments de méthode d’action.

Bon.

Il fait d’abord le matching des paramètres d’action.

Comme dans notre cas, il trouve que le paramètre d’action s’appelle « message » et que je lui envoie un paramètre qui s’appelle « message » pour ma propriété, il croit que c’est pour son argument d’action.

Du coup, il veut mapper la valeur dedans, et se rend compte que c’est un type complexe (et pas une string).

Il sait pas faire.

On récupère un null.

Advertisements

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s