2012-03-06 11 views
0

コントローラー内で複数のビューをフラッシュしたいと思います。MVC3コントローラの中央にビューを表示

public ActionResult MyController() 
{ 
    ViewBag.Data=CalculateSomeData(); 
    ShowView(); 
    ViewBag.Data+=CalculateMoreData(); 
    ShowView(); 
    ViewBag.Data+=CalculateExtraData(); 
    return View(); 
} 

データの計算に時間がかかり、表示を増分で表示したいとします。

+0

あなたのアクションはActionResultを返さなければならず、その 'return View();'行で発生します。その前に何も返されません。 – veblock

答えて

0

これは少しのAjaxの仕事のように見えますが、あなたの仕事がどう動くかについていくつか考え直してください。

最初のものは最初のユーザーは、私はタスクを追加し、返すメソッドを持つ仕事をするために別のコントローラを作成します

public class RequestTaskController: Controller 
{ 
    public ActionResult LongRunningAction() 
    { 
     return View(); 
    } 
} 

次のタスクを要求することができる場所私は、独自のコントローラでこれを置くあなたのビューを表示します部分的な結果

public class WorkController: Controller 
{ 
    [HttpPost] 
    public ActionResult CreateLongRunningTask(TaskRequestViewModel viewModel) 
    { 
     AddTask(viewModel); 
     return CurrentTasks(); 
    } 
} 


public PartialViewResult AddTask(TaskRequestViewModel viewModel) 
{ 
    // I'm using Session here because its easy 
    var currentTasks = Session["tasks"] as ConcurrentDictionary<string, Task>?? 
           new ConcurrentDictionary<string, Task>(); 

    Task task; 
    if (!currentTasks.TryGetValue(viewModel.Key, out task)) 
    { 
     task = new Task(); // what ever that is 
     currentTasks.TryAdd(key, task); 
    } 

    // do stuff with task like change progess, add payload, mark as complete 

} 



public PartialViewResult CurrentTasks() 
{ 
    ViewData.Model = Session["tasks"] as ConcurrentDictionary<string, Task>?? 
           new ConcurrentDictionary<string, Task>(); 

    // do stuff with task like change progess, add payload, mark as complete 

    return PartialView("_CurrentTasks"); 
} 

部分図_CurrentTasks.cshtmlは閲覧/共有にあるであろうと、あなたが持っているとどのような進展、彼らは何をしているか、タスクリストアップします。

@using System.Collections.Concurrent 
@using Your.Models 
@model ConcurrentDictionary<string, Tasks> 

<ul> 
@if (Model.Count > 0) 
{ 
    foreach (var task in Model) 
    { 
     <li>@:task</li> 
    } 
} 
</ul> 

だから、それを表示することに注意してください。今は、LongRunningActionビューにすべてをラップしてそこのどこかで、このようなことをしたいと思うようにします。

<div id="currentTasks" /> 

<script type="text/javascript"> 

var interval; 

function loadPartialView() { 
    //Populate the contents of the placeholder with the result returned by the action method 
    $('#currentTasks').load('@Url.Action("CurrentTasks", "Work")', function() { 
     // maybe do something to links 
    }); 
} 

$(function() { 

    loadPartialView(); 

    interval = setInterval(loadPartialView, 5000); 

}); 

</script> 

うまくいけば、あなたはどこにいてもよいでしょう。

+0

WOW。どのような素晴らしい答え。どうもありがとうございました。 – Matt

1

そんなことはできません。ビューがレンダリングされるまでブラウザーに何も送信されず、コントローラーからビューを戻した後にそのビューが表示されます。

データを計算中にページを表示するには、2つ以上の要求でページを表示する必要があります。最初にプレーンページをデータなしで表示してから、AJAXリクエストをサーバーに送信してデータを計算し、スクリプトに戻ってページに表示させます。

関連する問題