2012-03-06 4 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

이것은 약간의 아약스에 대한 직업이며 직장이 어떻게 돌아가는지 다시 생각해 보입니다.

첫 번째 것들 먼저 사용자가 내가 작업을 추가하고 반환 방법과 작업을 수행하기 위해 다른 컨트롤러를 만들 것

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

이렇게하면 안됩니다. 뷰가 렌더링 될 때까지 아무 것도 브라우저로 보내지지 않고 컨트롤러에서 뷰를 반환 한 후에 발생합니다.

데이터를 계산하는 동안 페이지를 표시하려면 둘 이상의 요청에서 페이지를 표시해야합니다. 먼저 데이터없이 일반 페이지를 표시 한 다음 데이터를 계산 한 서버로 AJAX 요청을하고 페이지에 표시 할 스크립트로 돌아갑니다.

관련 문제