如果我有视图和部分视图,有什么办法可以将数据从部分视图传递给父视图吗?
所以,如果我有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"]
的调用仍然没有遗憾。
答案 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