2012-02-24 66 views
1

我使用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); 
} 

回答

3

不要以为MVC中ViewBag就像一个WebForms的ViewState的 - 它不是在象ViewState这样每个请求重新填充。您必须在下一个请求中再次设置ViewBag中的所有内容。

所以,你需要另一种解决方案,无论是

  • 传递itemToMonitor串在你的Ajax请求监控
  • 保存itemToMonitor的会议,并访问在_MonitorDetails
+0

传:

if (TempData.ContainsKey("IsReadOnly")) { TempData["IsReadOnly"] = true; } else { TempData.Add("IsReadOnly", true); } 

我可以在我的看法是这样,这实际上是一个MVC Telerik的网格内得到这个数据沿着Ajax请求中的itemToMonitor运行。我会再开放一段时间,期待更简单的方法。 – 2012-02-24 02:12:32

+0

我还有一些其他的选择,比如预处理处理程序和那种东西,但这会更复杂,所以我想我提到了最简单的方法。但我很高兴看到更简单的解决方案! – Marc 2012-02-24 02:39:49

1

因为你有一个ajax调用,这实际上是一个新的请求,请尝试使用专门用于请求之间数据的TempData。

例如,在我的控制器我有这样的事情:

columns.Bound(o => o.OrderOfSignature).Width(50).ReadOnly(TempData["IsReadOnly"].ToString().ToLower() == "true" ? true : false).Title("Order"); 
+1

'==“真”?真:假'?为什么不只是'==“真”“? – 2012-12-18 17:20:00