2016-04-25 3 views
1

J'utilise Chart dans Web.Helpers pour générer des graphiques pour une vue. L'ensemble de données pour cette vue peut être distingué par type en sous-ensembles, et la vue permet à l'utilisateur de sélectionner un type.L'utilisation de la méthode du contrôleur de vue pour obtenir les dernières données de graphique est appelée chaque fois que PartialView est appelé

Mon point de vue de rasoir contenant ce graphique (_Chart.schtml) est simplement:

<p> 
<img src="/MyController/MyChart" /> 
</p> 

Le code du contrôleur (simplifié)

public void MyChart() 
{ 
    ChartSeries[] data = GetChartData(new string[] { _curChartDataType }); 
var chart = 
       new Chart(500, 200, ChartTheme.Green); 

        for (int i=0; i<data.Length; i++) { 
         title += data[i].name + " "; 
         chart.AddSeries(name: data[i].name, chartType: "Line",              
          xValue: data[i].xValue, xField: data[i].xField,     
          yValues: data[i].yValues, yFields: data[i].yFields); 
        } 
        chart.AddTitle(title) 
        .AddLegend() 
        .Write("png"); 
} 


public ActionResult ObjectList() 
{ 
      // irrelevant code removed 

      return PartialView("_Chart"); 
} 

Dans cshtml de la vue parent, j'utilise jquery pour attraper le changement de l'utilisateur dans la sélection du type et invoquer l'appel à MyController/ObjectList dans ajax.

Le graphique s'affiche correctement lorsque la vue est chargée pour la première fois. Toutefois, les modifications de type invoquées par l'utilisateur entraînent un appel ultérieur à ObjectList (comme prévu), mais MyChart() ne sera jamais appelé à nouveau après la première fois.

Tout ce que je devrais faire pour m'assurer que MyChart() est appelé à chaque fois que PartialView ("_ Chart") est appelé? Toutes les suggestions ont apprécié.

Répondre

0

D'accord, enfin sur une intuition, je fait les modifications suivantes:

public WebImage MyChart() 
{ 
    // same as before 
    ... 

    return chart.ToWebImage(); 
} 

Et devinez ce que c'était tout ce qu'il faut, pour que le moteur de vue de MVC reconnaisse que l'objet graphique doit être mis à jour. L'objet Chart a une méthode Write() pour écrire dans sa propre structure interne (qui est en quelque sorte rendue disponible en tant qu'image pour le html), et ToWebImage() pour écrire explicitement dans une structure que le html peut utiliser exactement de la même manière .. La différence étant que le dernier sait se mettre à jour. Allez comprendre.

J'espère que cela aide quelqu'un.

0

Assurez-vous que JQuery ne soit pas mise en cache des résultats, sur votre méthode ajax, mettez les éléments suivants:

$.ajax({ 
    cache: false 
.... 
}); 
+0

Merci pour le rappel! Cependant, le cache: false a déjà été défini et n'affecte pas le résultat. – ltree