【问题标题】:Is it possible to nest partial views?是否可以嵌套部分视图?
【发布时间】:2014-08-07 20:21:36
【问题描述】:

我知道this question,但原发帖人接受了一个不涉及嵌套的解决方案。我肯定想嵌套部分视图(当然,除非有更好的方法。)

我有一个页面可以 Ajax 加载几个部分视图之一,这取决于用户在主视图中的操作。 (这些视图是局部的,因为我的理解是,如果您想从 Ajax 调用中加载重要的附加内容,则需要从调用中返回一个 PartialViewResult。)几个局部视图有一个共同的元素,一个下拉菜单,我会喜欢将其分解成自己的部分观点。

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

但在运行时我收到一条错误消息,指出我的局部视图需要 Nullable 但收到了 X,其中 X 是与父局部视图关联的视图模型的类型。

所以我的问题是双重的:

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

  2. 除了局部视图之外,有没有办法获得我想要的效果,即分解出来的通用界面元素?我考虑过但没有尝试过创建一个编辑模板,因为我认为对局部视图不起作用的东西对它们不起作用,但我可能错了。

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

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

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

【问题讨论】:

  • 响应您的编辑:您必须将 null 转换为可空的 int,例如 (int?)null
  • @dotjoe 这与传递 int 类型的模型属性或变量有不同的效果吗?那恰好有一个空值?因为我就是这么做的。我会认为如果将 null 强制转换为 int?可以工作,一个已经是 int 类型的变量?会工作。但事实并非如此。
  • 是的,这也应该有效...这与我的回答没有什么不同...很奇怪。

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


【解决方案1】:

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

例子

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

【讨论】:

  • 谢谢!这帮助我找出了我的问题!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可以在父视图中使用部分渲染并调用某些子视图 您也可以使用视图包传递数据 当您从父视图调用部分视图时,您从控制器传递到父视图的数据可以传递给子视图 我使用视图包将我的数据发送到子视图

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      • 2012-01-12
      • 2011-03-18
      • 2013-04-22
      • 1970-01-01
      相关资源
      最近更新 更多