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

时间:2013-11-04 11:11:04

标签: c# asp.net-mvc razor

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

所以,如果我有View.cshtml

<div id="@someDataFromPartialSomehow">
    @Html.Partial("_PartialView")
</div>

_PartialView.cshtml

@{ someDataFromPartialSomehow = "some-data" }

<div>
    Some content
</div>

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

我尝试使用ViewBag.SomeDataFromPartialSomehow,但这只会在父级中产生null


尝试

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

View.cshtml

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

<div id="@ViewData["Stuff"]">
    @result
<div>

_PartialView.cshtml

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

<div>
    Content
</div>

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

5 个答案:

答案 0 :(得分:24)

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

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

然后:

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

<div id="@this.ViewContext.HttpContext.Items["Stuff"]">
    @result
<div>

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

<div id="@someDataFromPartialSomehow">
    @Html.Partial("_PartialView")
</div>

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

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

答案 1 :(得分:3)

我有一个建议。

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

例如:_PartialView.cshtml

<input type="hidden" id="someDataFromPartialSomehow" value="5" />

在你看来

<script>
$(document).ready(function(){
   var someDataFromPartialSomehow = $("#someDataFromPartialSomehow").val();
});
</script>

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

答案 2 :(得分:0)

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

View.cshtml

@{ 
    dynamic properties = new NullingExpandoObject();

    var result = Html.Partial("_PartialView", (NullingExpandoObject)properties); 
}

<div id="@properties.Id">
    @result
<div>

_PartialView.cshtml

@{ Model.Id = "foo"; }

<div>
    Content
</div>

Where NullingExpandoObject is Jon Skeet's nullable dynamic dictionary

答案 3 :(得分:0)

您可以直接使用 javascript 。 我在局部视图中有这个隐藏的文本框,我想在父视图中访问它的值

<input type="text" name="allexamcount" id="allexamcount" value="@TempData["allexamcnt"]" hidden />

因此,最简单的方法如下:

var allexamcount = document.getElementById("allexamcount").value;
document.getElementById("examcount").value = allexamcount ;

答案 4 :(得分:0)

您可以在_PartialView.cshtml中做的更简单的事情:

@model dynamic
@{ 
    Model.Stuff = "stuff things";
}

并在父视图中:

@{ 
    Html.RenderPartial("_PartialView", (object) ViewBag);
}

然后在父视图中可以使用:

@ViewBag.Stuff