Grafici ASP.Net: l'ottenimento tramite jQuery su IE 7 impedisce il caricamento dell'immagine
-
05-07-2019 - |
Domanda
Sto usando Controlli grafici ASP.Net e ASP.Net MVC.
Sto cercando di visualizzare un grafico su una pagina, l'utente può modificare vari dati associati a questo grafico e quindi premere un pulsante che eseguirà un'operazione POST e quindi restituirà un grafico di nuovo rendering. Questo viene aggiornato tramite jQuery che carica una vista parziale contenente il grafico.
Il problema che sto riscontrando è che in Internet Explorer 7 non riesco a trovare l'icona. Stranamente funziona bene in Firefox!
Il processo di aggiornamento del grafico:
- Invia nuovi parametri in un POST
- Applicazione modificata parametri sull'oggetto grafico
- Il controller invia l'oggetto grafico alla vista parziale che lo rende come un controllo
- jQuery quindi si carica in questa vista parziale. In IE 7 ottengo l'icona immagine non trovata.
Ecco il codice utilizzato nella vista parziale per rendere l'oggetto grafico:
if (Model.Chart != null)
{
Model.Chart.Page = this.Page;
System.Web.UI.DataVisualization.Charting.Chart Chart1 = Model.Chart;
using (HtmlTextWriter writer = new HtmlTextWriter(this.Response.Output))
{
try
{
Chart1.ImageType = System.Web.UI.DataVisualization.Charting.ChartImageType.Jpeg;
Chart1.RenderControl(writer);
}
catch (Exception ex)
{
writer.WriteEncodedText(ex.Message);
}
}
}
Cheers!
Il jQuery che carica questi grafici è il seguente:
function PostWidgetDataOverride(ChartID) {
$.ajax({
url: "/Home/GetChart",
type: "POST",
dataType: "HTML",
data: { ChartID: ChartID, SeriesID: $('.SeriesID').val(), ParameterDefaults: $('.parameterDefault').serialize(), Time: getTimeStamp() },
success: UpdateChart
});
}
function UpdateChart(ChartContent) {
$("#widgetConfig").dialog("close");
var existingChart = CheckIfWidgetIsOnPage($(ChartContent).attr("id"))
if (existingChart !== undefined) {
existingChart.fadeOut("slow", function() { existingChart.replaceWith(ChartContent); }).fadeIn("slow");
}
else {
$(ChartContent).appendTo($("#dashboardArea")).fadeIn("slow");
}
}
Soluzione
Penso che il problema sia come si ottiene l'immagine. Dal codice che hai pubblicato sembra che tu stia ottenendo i dati dell'immagine reale tramite un download Ajax e quindi inserendo i nuovi dati immagine nel DOM. Questo potrebbe funzionare per Firefox, ma non per IE (P.S non ha mai provato neanche). Supponendo comunque che a IE non piaccia, sarebbe meglio puntare l'immagine su un gestore di immagini tramite l'attributo source dell'elemento image. Quando è necessario modificare l'immagine, è sufficiente modificare i parametri nell'URL inviato al gestore, quando questo cambia IE e Firefox farà una richiesta per la nuova immagine. Ad esempio:
L'HTML
<img src="./chart.aspx?SeriesId=456&ChartId=123&Time=20091021155300" id="chart" />
Il da jQuery quando è necessario aggiornare il grafico:
function UpdateChart(chartId, seriesId, time){
$("#chart").attr("src","./chart.aspx?SeriesId="+seriesId+"&ChartId="+chartId+"&Time="+time);
}
Altri suggerimenti
puoi scrivere un servizio per ripulire le immagini che risalgono a x giorni fa oppure puoi usare #SEQ (maxFiles, minuti) per impostare la scadenza ma non è molto flessibile con la denominazione.
Ho funzionato cambiando ImageStorageMode in:
Chart1.ImageStorageMode = System.Web.UI.DataVisualization.Charting.ImageStorageMode.UseImageLocation
ma ora si blocca in una cartella. Non voglio che una cartella si ostruisca con le immagini ...