是否可以嵌套部分视图?

时间:2012-02-24 20:31:17

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

我知道this question,但原始海报接受了一个不涉及嵌套的解决方案。我绝对想要嵌套部分视图(当然,除非有更好的方法。)

我有一个页面可以Ajax加载其中一个部分视图,具体取决于用户在主视图中的操作。 (视图是部分的,因为我的理解是,如果你想从Ajax调用中加载重要的附加内容,你需要从你的调用返回一个PartialViewResult。)几个部分视图有一个共同的元素,一个下拉列表,我想喜欢将其纳入自己的局部视野。

但这不起作用。我的部分视图每个都有一个关联的视图模型,这是他们的模型。对于嵌套的局部视图,我想从父视图的视图模型中传递单个字段(可为空的int)的值作为嵌套的局部视图的模型。

但是在运行时我得到一个错误,说我的部分视图需要Nullable< int>但收到X,其中X是与父部分视图关联的视图模型的类型。

所以我的问题有两个:

  1. 是否仅允许嵌套部分视图? (在这种情况下,我希望框架会检查情况并抛出一个明确说明的错误。)

  2. 除了部分视图之外,有没有办法获得我想要的效果,一个分解出来的公共界面元素?我已经考虑过,但没有尝试过,创建一个编辑模板,因为我认为对于那些不适用于部分视图的内容对那些不起作用,但我可能是错的。

  3. ETA:我发现了我的问题:当你将模型的空值传递给HtmlHelper.Partial或RenderPartial时,渲染引擎会替代调用局部视图的模型来代替那个null,假设你根本没有传递一个模型。

    在我的情况下不是这样的:我的Nullable< int>是Nullable,因为在它设置之前,它是空的! null在语义上是有意义的!

    但这就是我遇到问题的原因。

3 个答案:

答案 0 :(得分:4)

是的,您可以嵌套部分视图。只要确保传递正确的模型。 HtmlHelpers在这里非常有用,因为您可以使用完整视图路径封装对RenderPartial的调用,并确保使用正确的模型。

例如

public static void RenderSomePartial(this HtmlHelper helper, int? i)
{
    helper.RenderPartial("~/Views/Shared/SomePartial.cshtml", i);
}

答案 1 :(得分:1)

是的,你可以。如果你需要传递模型,它可能会有点混乱。如果您使用的是强类型模型,请尝试使用DisplayTemplates或EditorTemplates而不是partials。

答案 2 :(得分:0)

您可以在父视图中使用render partial并调用某个子视图 你也可以通过查看包传递数据 当您从父级调用部分视图时,从控制器传递到父视图的数据可以传递给子视图 我使用视图包将我的数据发送到子视图