AnimaSola
AnimaSola

Reputation: 7846

Access Parent Model from partial view

I'm asking because the partial view I will create is blank, with the purpose of creating a new child entity. I just need a quick, regardless if dirty, way to access the Parent Model from within the partial view. I need the Id of the parent.

Does a partial view automatically have access to the model of the parent?

Upvotes: 18

Views: 34445

Answers (5)

Stephen O
Stephen O

Reputation: 101

Under normal circumstances you can and should just pass the value down into the partial, but we ran into an edge case where this didn't make sense. If you're absolutely sure that you have to, you can easily access the parent Model or ViewBag as follows:

// Get the parent's model
var model ViewContext.Controller.ViewData.Model as MyType
// Get the parent's ViewBag
var value = ViewContext.Controller.ViewBag.MyVariableName as MyType

The situation we ran into had the following constraints that lead us to making use of this:

  1. Partials are automatically generated, inserted and rendered rather than explicitly called from our Razor Pages (In our case, these are ads inserted into an article at certain word counts by our CMS)
  2. The models we pass into the Partial when they're being automatically rendered are generated based on values saved in a DB, so we only want to have things which definitely won't change in the model (And can't include User-specific information or information which could change without the page being regenerated)

Upvotes: 2

RC Cola
RC Cola

Reputation: 76

You can just pass the model IE:

The encapsulating view:

    @model MyModel
    @Html.Partial("_myPartial", Model)

Partial View:

    @model MyModel
    Id = @Model.Id;

Upvotes: 1

JOpuckman
JOpuckman

Reputation: 1376

This ended up working for me.

@model MyViewModel
...
@Html.Partial("_myPartial", new ViewDataDictionary { { "id", Model.Id } })

And inside the partial view, used this...

<div>@ViewBag.id</div>

Upvotes: 2

Yushatak
Yushatak

Reputation: 761

I know this is an old topic, but I figured I'd just add my solution to the same problem anyway. I think it's a bit cleaner.

Basically add a model to the partial view.

The encapsulating view:

@model whatever
...
@Html.Partial("partialview", anotherwhatever)

The partial view:

@model anotherwhatever
<div>@Model.something</div>
...

In my case I just needed to pass a string into the partial view (just using it to shorten and partition code), so this was much more elegant than the other solution.

I tried the other solution first and actually couldn't get it to work, it just acted as though the value I passed was blank.

Upvotes: 3

Darin Dimitrov
Darin Dimitrov

Reputation: 1038730

You cannot access the parent model from a partial view unless you pass some value to this partial as parameters when rendering it. For example in your main view:

@model MyViewModel
...
@Html.Partial("_myPartial", new ViewDataDictionary(new { id = Model.Id }));

and then inside your partial you could access the Id:

<div>@ViewBag.Id</div>

Of course this is a pretty lousy way of passing data to a partial view. The correct way is to use a strongly typed view model.

Upvotes: 18

Related Questions