Access Parent Model from partial view

前端 未结 5 2011
半阙折子戏
半阙折子戏 2021-01-07 22:00

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 Pa

相关标签:
5条回答
  • 2021-01-07 22:31

    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.

    0 讨论(0)
  • 2021-01-07 22:36

    You can just pass the model IE:

    The encapsulating view:

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

    Partial View:

        @model MyModel
        Id = @Model.Id;
    
    0 讨论(0)
  • 2021-01-07 22:42

    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.

    0 讨论(0)
  • 2021-01-07 22:53

    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>
    
    0 讨论(0)
  • 2021-01-07 22:55

    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)
    0 讨论(0)
提交回复
热议问题