2012-02-24 4 views
1

Я использую 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); 
} 

ответ

3

Не думаю, что ViewBag в MVC подобно ViewState в WebForms - это не пополнен при каждом запросе, как в ViewState. Вы должны снова установить все в ViewBag при следующем запросе.

Так что вам нужно другое решение, либо

  • передать строку itemToMonitor к монитору в Ajax запроса
  • сохранить itemToMonitor в сессии и доступ, что в _MonitorDetails
+0

Passing по itemToMonitor в запросе Ajax. Я оставлю это открытым некоторое время, надеясь на более простой подход. –

+0

У меня есть некоторые другие варианты, такие как обработчики предшествующих действий и такие вещи, но это будет еще сложнее, поэтому я думаю, что я упомянул простейшие способы. Но я рад видеть и более легкое решение! – Marc

1

Потому что у вас есть ajax-вызов, который действительно является новым запросом, попробуйте использовать TempData, который специально предназначен для данных между запросами.

К примеру, в моем контроллере у меня есть что-то вроде этого:

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

я могу получить эти данные, на мой взгляд, как это, что на самом деле внутри Telerik сетки MVC:

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

'==" true "? true: false'? Почему не просто '==" true "? –

Смежные вопросы