Я использую Ajax для обновления частичного представления и обнаруживаю, что содержимое ViewBag недоступно, когда контроллер вызывается для выполнения обновления.MVC 3 ViewBag Lost on Partial View Refresh
В частности, я размещаю элемент в 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);
}
Passing по itemToMonitor в запросе Ajax. Я оставлю это открытым некоторое время, надеясь на более простой подход. –
У меня есть некоторые другие варианты, такие как обработчики предшествующих действий и такие вещи, но это будет еще сложнее, поэтому я думаю, что я упомянул простейшие способы. Но я рад видеть и более легкое решение! – Marc