2012-02-24 123 views
3

我知道this question,但原始海报接受了一个不涉及嵌套的解决方案。我肯定希望嵌套部分视图(当然,除非有更好的方法)。是否可以嵌套部分视图?

我有一个页面,可以根据用户在主视图中的操作,加载几个部分视图之一。 (这些视图是部分的,因为我的理解是,如果你想从Ajax调用中加载重要的附加内容,则需要从调用中返回一个PartialViewResult。)几个部分视图有一个公共元素,一个下拉列表,喜欢把它分解成它自己的部分观点。

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

但是在运行时,我收到一个错误消息,说我的局部视图需要一个可为空的对象,但是接收到了X,其中X是与父局部视图关联的视图模型的类型。

所以我的问题是双重的:

  1. 是筑巢的部分景色根本不允许? (在这种情况下,我希望框架将检查情况并抛出一个错误,如此明确说)。

  2. 有没有办法让我想要的效果,一个分解出来的通用界面元素,其他比部分观点?我已经考虑过,但没有尝试过创建编辑模板,因为我相信对部分视图不起作用的东西对于这些不起作用,但我可能是错的。

ETA:我发现我的问题:当你通过对模型中的空值到HtmlHelper.Partial或的RenderPartial,渲染引擎subsitutes的地方,空的呼唤局部视图模型,假设你根本没有通过一个模型。

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

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

+1

为了响应您的编辑:您必须将null转换为可空int,例如'(int?)null' – dotjoe 2012-02-24 22:28:54

+0

@dotjoe这会有一个不同的效果比传递一个模型属性或类型为int的变量吗?那恰好有一个空值?因为那正是我所做的。我会认为,如果一个空投给int?会工作,一个已经是int类型的变量?会工作。但事实并非如此。 – 2012-02-25 00:05:24

+0

是的,这也应该工作......它不会比我的答案...怪异。 – dotjoe 2012-02-25 14:30:02

回答

3

是的,你可以嵌套部分视图。只要确保你通过了正确的模型。 HtmlHelpers在这里很有用,因为你可以用完整的视图路径封装对RenderPartial的调用,并确保使用正确的模型。

例如

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

谢谢!这帮助我找出了我的问题! – 2012-02-24 21:15:37

1

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

+0

谢谢;这是一个很好的建议。 – 2012-02-24 21:16:01

0

您可以使用呈现在你的父视图部分和调用一些子视图 你也可以通过与视图袋 数据,当你调用从父的局部视图从控制器到父视图通过数据可以传递到子视图 我使用视图包发送我的数据到子视图

+0

谢谢;这很有帮助。 – 2012-02-24 21:16:23