7

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

所以如果我有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"]仍然没有产生任何效果。

4

5 回答 5

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使用,这显然是不可能的。

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

于 2013-11-04T11:16:38.010 回答
3

我有一个建议给你。

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

例如:在 _PartialView.cshtml

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

在你看来

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

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

于 2013-11-04T11:30:48.787 回答
1

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

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>

NullingExpandoObjectJon Skeet 的可空动态字典在哪里

于 2013-11-04T18:02:43.580 回答
0

您可以简单地为此使用javascript 。我在部分视图中有这个隐藏的文本框,我想在父视图中访问它的值

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

所以,最简单的方法如下:

var allexamcount = document.getElementById("allexamcount").value;
document.getElementById("examcount").value = allexamcount ;
于 2018-11-03T19:18:21.157 回答
0

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

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

在父视图中:

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

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

@ViewBag.Stuff
于 2018-11-09T17:23:49.153 回答