web-dev-qa-db-fra.com

(PartialView) L'élément de modèle passé dans le dictionnaire est de type «Client», mais ce dictionnaire nécessite un élément de modèle de type «Profil utilisateur»

@model Customer

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile)

Lorsque j'exécute ce code, j'obtiens cette erreur:

The model item passed into the dictionary is of type 'Customer', but this dictionary requires a model item of type 'UserProfile'.

La vue partielle _UserProfile est fortement typée.

Je veux pouvoir éditer ces champs. Aucune suggestion?

41
Razzer

Assurez-vous que votre Model.UserProfile est non nulle.

J'ai trouvé que votre message essayait de déboguer la même erreur, et il s'est avéré que je n'avais pas initialisé mon "Model.UserProfile "équivalent.

Je suppose que ce qui se passe ici, c'est que si un modèle nul est passé à RenderPartial, il utilise par défaut le modèle de la vue principale? Quelqu'un peut-il confirmer cela?

94
Murray

Si Model.UserProfile est nul, il tentera de transmettre votre modèle client.

Deux façons de contourner ce problème:

@model Customer

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile, new ViewDataDictionary())

Ou:

@model Customer

if (Model.UserProfile != null)
{
   @Html.Partial("_UserProfile", (UserProfile)Model.UserProfile)
}
22
Kcoder

J'ai rencontré ce problème lorsque j'ai traité des parties d'un profil utilisateur telles que les enregistrements de nom et d'adresse. Si l'utilisateur avait un profil incomplet, je veux que la vue de gestion de compte détecte un enregistrement d'adresse nul et affiche un lien d'action pour créer une nouvelle adresse ou afficher toutes les données d'adresse disponibles.

Comme décrit par d'autres lorsque null est transmis, la surcharge de Html.RenderPartial est déclenchée et le modèle de vue parent est transmis. J'ai fini par convertir mes vues partielles en modèles d'affichage et d'édition pour contourner ce problème. Voici quelques articles pratiques de: Hansleman et codegur

Vous obtenez une meilleure réutilisation de cette méthode et elle conserve les valeurs nulles: Dans votre vue:

@Html.DisplayFor( m=> m.Address)

Ensuite, gérez la valeur nulle dans le DisplayTemplate.

@model Namespace.Models.MyObject
...
if(@Model != null){
...
}else{
...
}
1
reachingnexus

J'ai fait face au même problème mais finalement je l'avais compris. Il y a une incompatibilité de type dans les modèles passés. Votre vue accepte le modèle de type Customer mais votre vue partielle passe le modèle Userprofile donc ce que vous avez à faire est de passer le même modèle dans les deux ou .... créez un modèle qui possède toutes les propriétés des deux modèles. Votre problème sera sûrement résolu.

1
Dashanan

Il se repliera sur le modèle initial si l'élément transmis est nul.

Essaye ça:

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile ?? new UserProfile())
0
annemartijn