将数据从“部分视图”传递到其父视图

如果我有视图和部分视图,有什么方法可以将数据从部分视图传递给父视图?

所以,如果我有View.cshtml

 
@Html.Partial("_PartialView")

_PartialView.cshtml

 @{ someDataFromPartialSomehow = "some-data" } 
Some content

我将如何实现这样的事情?

我尝试使用ViewBag.SomeDataFromPartialSomehow ,但这只会在Parent中导致null


一次尝试

要尝试解决在调用之前生成的数据问题,我试过这个:

View.cshtml

 @{ var result = Html.Partial("_PartialView"); } 
@result

_PartialView.cshtml

 @{ ViewData["Stuff"] = "foo"; } 
Content

但是对@ViewDate["Stuff"]的调用仍然没有遗憾。

您可以使用HttpContext在视图之间共享状态。

 @{ this.ViewContext.HttpContext.Items["Stuff"] = "some-data"; } 

然后:

 @{ var result = Html.Partial("_PartialView"); } 
@result

除了您在问题中显示的示例:

 
@Html.Partial("_PartialView")

你试图使用someDataFromPartialSomehow甚至调用部分视图之前 ,这显然是不可能的。

还要记住,你想要实现的是糟糕的设计。 如果部分视图只能在某个特定父级的上下文中工作,那么您可能需要重新考虑视图分离。 部分视图必须是独立和可重用的,无论它在哪种上下文中。 如果它假定托管父母的事情,那么这里有一个严重的设计问题。

我有个建议。

将隐藏的输入字段放在局部视图中并从javascript中获取它们。

例如:在_PartialView.cshtml中

  

在你看来

  

请注意,您必须在文档就绪函数内编写js函数,因为部分视图应该完全加载。

所以经过一番思考后我想出了这个:

View.cshtml

 @{ dynamic properties = new NullingExpandoObject(); var result = Html.Partial("_PartialView", (NullingExpandoObject)properties); } 
@result

_PartialView.cshtml

 @{ Model.Id = "foo"; } 
Content

其中NullingExpandoObject是Jon Skeet的可空动态字典