@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?
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?
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)
}
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{
...
}
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.
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())