能否嵌套局部视图?

5

我知道这个问题,但原帖作者接受的解决方案不涉及嵌套。除非有更好的方法,否则我肯定想要嵌套部分视图。

我有一个页面,可以根据用户在主视图中的操作Ajax加载多个部分视图。(视图是部分视图,因为我的理解是,如果您想从Ajax调用中加载大量附加内容,则需要从调用返回PartialViewResult。)多个部分视图具有一个共同元素,即下拉菜单,我想将其拆分为自己的部分视图。

但这并没有起作用。我的每个部分视图都有一个关联的视图模型,就是它们的模型。对于嵌套的部分视图,我希望将父视图的视图模型的单个字段(可空int类型)的值传递给嵌套的部分视图作为其模型。

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

所以我的问题有两个方面:

  1. 嵌套部分视图是否被禁止?(如果是这样,我希望框架能够检查这种情况并抛出明确说明的错误。)

  2. 是否有一种方法可以实现我想要的效果,即一个因素化的公共接口元素,而不是使用部分视图?我考虑过,但没有尝试创建一个编辑模板,因为我认为对于部分视图不起作用的东西对于那些也不起作用,但我可能是错的。

ETA: 我找到了我的问题:当您将模型的空值传递给HtmlHelper.Partial或RenderPartial时,渲染引擎会将调用部分视图的模型替换为空值,假设您只是没有传递模型。

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

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


1
针对您的编辑:您需要将null转换为可空int,例如(int?)null - dotjoe
@dotjoe:传递一个null值的模型属性或int类型变量,是否与此有不同的效果呢?因为这就是我一直在做的。我原以为如果将null转换为int?可以工作,那么已经为int?类型的变量也可以工作。但事实并非如此。 - Ann L.
是的,那也可以行...这和我的答案没有任何区别...奇怪。 - dotjoe
3个回答

5

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

示例

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

谢谢!那帮助我解决了我的问题! - Ann L.

2

可以的。不过,如果你需要传递模型,可能会有些混乱。如果你使用强类型模型,请尝试使用 DisplayTemplates 或 EditorTemplates 代替部分视图。


0

你可以在父视图中使用render partial并调用一些子视图, 你也可以通过view bag传递数据 当你从父视图调用部分视图时,你从控制器传递到父视图的数据可以传递到子视图 我使用view bag将我的数据发送到子视图


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接