2010-04-16 3 views
0

Je voudrais accomplir ce qui suit:Appel d'une action AsyncController à partir d'une autre action du contrôleur?

class SearchController : AsyncController 
{ 
    public ActionResult Index(string query) 
    { 
     if(!isCached(query)) 
     { 
      // here I want to asynchronously invoke the Search action 
     } 
     else 
     { 
      ViewData["results"] = Cache.Get("results"); 
     } 

     return View(); 
    } 

    public void SearchAsync() 
    { 
     // some work 

     Cache.Add("results", result); 
    } 
} 

Je prévois de faire un « ping » AJAX du client afin de savoir quand les résultats sont disponibles, puis de les afficher.

Mais je ne sais pas comment appeler l'action asynchrone d'une manière asynchrone!

Merci beaucoup. Luis

Répondre

0

Vous pouvez invoquer l'action dans un nouveau thread:

if(!isCached(query)) 
{ 
    new Thread(SearchAsync).Start(); 
} 

La vue pourrait utiliser un appel AJAX à une action qui vérifierait si les résultats sont disponibles:

public ActionResult Done(string query) 
{ 
    return Json(new 
    { 
     isDone = !isCached(query), 
     result = Cache.Get(query) 
    }); 
} 

Et le ping:

var intId = setInterval(function() { 
    $.getJSON('/search/done', { query: 'some query' }, function(json) { 
     if (json.isDone) { 
      clearInterval(intId); 
      // TODO : exploit json.result 
     } else { 
      // TODO: tell the user to wait :-) 
     } 
    }); 
}, 2000); 
+0

Merci! Solution plutôt cool :) – Luis

Questions connexes