从局部视图访问父模型

时间:2013-03-10 12:23:22

标签: asp.net-mvc asp.net-mvc-3 razor partial-views

我问,因为我要创建的局部视图是空白的,目的是创建一个新的子实体。我只需要一个快速的,无论是否脏的方式从局部视图中访问父模型。我需要父母的身份证。

部分视图是否可以自动访问父模型?

5 个答案:

答案 0 :(得分:14)

除非在渲染时将某些值作为参数传递给此部分,否则无法从局部视图访问父模型。例如,在主视图中:

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

然后在您的部分内部,您可以访问Id

<div>@ViewBag.Id</div>

当然,这是将数据传递到局部视图的一种非常糟糕的方式。正确的方法是使用强类型视图模型。

答案 1 :(得分:2)

我知道这是一个古老的话题,但我想我还是会在同样的问题上添加我的解决方案。我认为它有点清洁。

基本上将模型添加到局部视图中。

封装视图:

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

部分视图:

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

在我的情况下,我只需要将一个字符串传递给局部视图(只是使用它来缩短和分区代码),所以这比其他解决方案更优雅。

我首先尝试了另一个解决方案,实际上无法让它工作,它只是表现为我传递的值是空白的。

答案 2 :(得分:1)

这最终为我工作。

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

在局部视图中,使用了这个......

<div>@ViewBag.id</div>

答案 3 :(得分:1)

在正常情况下,您可以并且应该将值向下传递给局部变量,但是我们遇到了一个极端的情况,这没有任何意义。如果您绝对确定必须这样做,则可以按如下所示轻松访问父模型或ViewBag:

// 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

我们遇到的情况具有以下限制,导致我们不得不使用此限制:

  1. 部分内容是自动生成,插入和呈现的,而不是从我们的Razor页面上显式调用的(在我们的情况下,这些内容是由我们的CMS以某些字数插入文章中的广告)
  2. 当我们自动将它们传递给Partial的模型是基于保存在数据库中的值生成的,因此我们只希望拥有在模型中绝对不会改变的东西(并且不能包含User特定的信息或在不重新生成页面的情况下可能会更改的信息)

答案 4 :(得分:0)

您可以通过模型IE:

封装视图:

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

部分视图:

    @model MyModel
    Id = @Model.Id;