我使用Ajax刷新部分视图,并发现在调用控制器执行刷新时,ViewBag内容不可用。MVC 3 ViewBag在部分视图中丢失刷新
具体来说,我把一个项目放在ViewBag.ItemToMonitor。它在第一次渲染局部视图时可用(这里我在控制器中使用它,但我也尝试在视图中使用它)。当部分视图通过Ajax刷新时,ViewBag不包含任何内容ItemToMonitor。
如何在刷新时使数据可用?
这里有一个简单的例子,基于MVC 3项目模板:
Index.cshtml
<div>
Select an item to monitor:
<ul>
<li>@Html.ActionLink("One", "Monitor", new { itemToMonitor = "Item One" })</li>
<li>@Html.ActionLink("Two", "Monitor", new { itemToMonitor = "Item Two" })</li>
<li>@Html.ActionLink("Three", "Monitor", new { itemToMonitoritem = "Item Three" })</li>
</ul>
</div>
Monitor.cshtml
@model string
<script type="text/javascript">
setInterval(function() {
$.post('@Url.Action("_MonitorDetails")', function (data) {
$('#refreshMe').html(data);
}
);
}, 5000);
</script>
<h2>Monitor</h2>
<div>Monitoring @ViewBag.ItemToMonitor</div>
<div id="refreshMe">
@Html.Partial("_MonitorDetails")
</div>
_MonitorDetails.cshtml
个@model string
<div style="background-color:Blue; color:White">
This is my partial view to monitor '@Model', updated at @DateTime.Now.ToString("u").
</div>
HomeController.cs
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult Monitor(string itemToMonitor)
{
ViewBag.ItemToMonitor = itemToMonitor;
return View((object)itemToMonitor);
}
public ActionResult _MonitorDetails()
{
string itemToMonitor = ViewBag.ItemToMonitor;
// itemToMonitor is null. Why?
return PartialView((object)itemToMonitor);
}
传:
我可以在我的看法是这样,这实际上是一个MVC Telerik的网格内得到这个数据沿着Ajax请求中的itemToMonitor运行。我会再开放一段时间,期待更简单的方法。 – 2012-02-24 02:12:32
我还有一些其他的选择,比如预处理处理程序和那种东西,但这会更复杂,所以我想我提到了最简单的方法。但我很高兴看到更简单的解决方案! – Marc 2012-02-24 02:39:49