Asp.net-mvc – How to invoke a partial view with “null” for its model

asp.net-mvcasp.net-mvc-3partial-views

Suppose I have a partial view called UserDetails whose @model clause is set to a model class called User.

Now suppose I have another model class that looks something like this:

public sealed class SpecialModel
{
    public User SpecialUser;
    public ... // other stuff
}

Inside a view for the SpecialModel, I want to invoke my partial view mentioned above:

@model MyProject.Models.SpecialModel
@{ ViewBag.Title = "..."; }
<div class='user'>@Html.Partial("UserDetails", Model.SpecialUser)</div>

This works just fine if the user is not null. However, if the user is null, I get this exception:

System.InvalidOperationException: The model item passed into the dictionary is of type 'MyProject.Models.SpecialModel', but this dictionary requires a model item of type 'MyProject.Models.User'.

Clearly, the exception message is lying. How do I fix this properly so that I can pass null normally?

Best Answer

Instead of

@Html.Partial("UserDetails", Model.SpecialUser)

write the more verbose

@Html.Partial("UserDetails", new ViewDataDictionary(Model.SpecialUser))

That makes this specific scenario work.

However, it has a downside: it clears all information passed from the controller. In particular, it clears all the validation information; if you are posting some data and you want to display a validation error message inside that partial view, you can’t use this technique.