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

@model Customer

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

When i run this code, i get this error:

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

Partial View _UserProfile is strongly typed.

I want to be able to edit these field. Any suggestions?


Make sure your Model.UserProfile is not null.

I found your post trying to debug the same error, and it turned out I hadn't initialised my "Model.UserProfile" equivalent.

I guess what's happening here, is that if a null model is passed to RenderPartial, it defaults to using the main view's model? Can anyone confirm this?


If Model.UserProfile is null, it will attempt to pass in your customer model.

Two ways to get around this:

@model Customer

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

Or:

@model Customer

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

I ran into this problem when dealing with parts of a user profile such as Name and Address records. If the user had an incomplete profile I want the account management view to detect a null Address record and display an Action link to create a new Address or display whatever address data is available.

As described by others when null is passed the overload for Html.RenderPartial gets triggered and the parent View Model is passed through. I ended up converting my partial views to Display and Editor Templates to get around it. Here are some How-To articles from: Hansleman and codeguru

You get better re-usability from this method and it preserves the null values: In your View:

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

Then handle the null value in the DisplayTemplate.

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