2012-02-24 35 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は、WebフォームでのViewStateのようなものであると考えてはいけない - それは、ViewStateのようなリクエストごとに補充されていません。次のリクエストで、ViewBagのすべてを再度設定する必要があります。

ですから、別のソリューションを必要とし、いずれかの

  • はあなたが持っているので_MonitorDetailsで
+0

渡す:私はMVCのtelerikグリッド内で、実際にこのような私の見解、このデータを取得することができます

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

は例えば、私のコントローラで私はこのような何かを持っていますAjaxリクエストのitemToMonitorに沿って動作します。もっと簡単なアプローチを望んでいる間、これをもう少し長く開いておきます。 –

+0

私はプリアクションハンドラやそのようなもののようないくつかのオプションを念頭に置いていますが、それはさらに複雑になるので、私は最も簡単な方法を述べたと思います。しかし、より簡単な解決策も見られてうれしいです! – Marc

1

ことをセッションとアクセスにitemToMonitorを保存し、あなたのAJAXリクエスト

  • に監視するitemToMonitor文字列を渡します本当に新しいリクエストであるajax呼び出しは、リクエスト間のデータ専用のTempDataを使ってみてください。

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

    '==" true "?真:偽?単に '==" true "'だけではないのですか? –

    関連する問題