iT邦幫忙

8

ASP.Net MVC 4 + jQuery UI Dialog + iFrame 動態產生圖檔的鳥問題

剛剛幫中部某大學校弄完了一個算是『偽』報表的功能
寫了一個Action + View,上頭弄了美美的圖表(Chart)
於是,又在jQuery UI Dialog裡頭掛上iFrame,達到Web的偽報表
剛開始的時候...感覺還不錯,突然心血來潮,給他在不關閉網頁的情況下
嘗試開啟兩次....結果...Orz
所有網頁元素都會更新...只有那兩個動態產生的統計圖表...落寞
所有網頁元素都會更新...只有那兩個動態產生的統計圖表...落寞
產生動態圖檔的action是這麼寫的...

//落落長的產生圖檔過程略過...
using(MemoryStream _stream = new MemoryStream())
{
  chart.SaveImage(ms,ChartImageFormat.Png);
  return new FileContentResult(ms.ToArray());
}

View裡頭的動態圖檔欄位是這麼寫的...

<img src="@Url.Action(產生圖檔的action)"

想不到啊...第一次產生圖檔都正確...在不關閉jq dialog所在的網頁下,
重新執行,不但動態圖表不會更新,居然連這個action都不會被執行...落寞
最後,在不想把圖檔儲存到server的磁碟機上的前提下,午覺一睡醒...想起了..base64的方法
飛開心讚
於是把action改成了method...

private string generateChart(List<data> data)
{
  //略....
  using(MemoryStream _stream = new MemoryStream())
  {
    chart.SaveImage(ms,ChartImageFormat.Png);
    return Convert.ToBase64String(ms.ToArray);
  }
}

Action的部份

//又略過...
ViewBag.ChartString = this.generateChart(data);

View的部份改成

<img src="data:image/png;base64,@ViewBag.ChartString" />

開心打完收工~~讚


0
外獅佬
iT邦大師 1 級 ‧ 2013-08-21 22:56:24

很納悶的是...原本的寫法,jq dialog開啟的時候,Url.Acion有正確執行,
所以,看到了正確的圖表
不離開網頁的情況下,再一次執行包含圖表的jq dialog(用dialog包iframe顯示網頁),
圖檔還在,但是沒有重新繪製,原本以為是cache作怪,怪怪...我沒設定cache..暈
在action裡頭設定了中斷點,終於發現..它根本沒有被執行汗
真是怪事....目前暫時用這種鳥方法解決有待哪位大師來幫我解惑啦~~

當時之所以不想把圖檔儲存成檔案,是為了避免多人使用時的檔案鎖定問題
卻意外發現這個更鳥的問題....Orz

0
ted99tw
iT邦高手 1 級 ‧ 2013-08-21 22:57:05

外獅佬要好好把握本月的種種不思議現象...暈

外獅佬 iT邦大師 1 級 ‧ 2013-08-21 23:05:09 檢舉

驚汗

0
海綿寶寶
iT邦大神 1 級 ‧ 2013-08-21 23:12:48

不懂純推
拍手

0
賽門
iT邦超人 1 級 ‧ 2013-08-21 23:26:28

拍手拍手拍手拍手拍手拍手
好厲害啊.....

0
老鷹(eagle)
iT邦高手 1 級 ‧ 2013-08-22 08:15:05

灑花灑花灑花
謝謝謝謝謝謝
筆記筆記筆記

總裁 iT邦好手 1 級 ‧ 2013-08-22 09:28:34 檢舉

獅子說這是你的問題....冷

ted99tw iT邦高手 1 級 ‧ 2013-08-22 09:34:03 檢舉

iT邦幫忙MVPwiselou提到:
鳥的問題...

也是大家的問題...冷

ted99tw提到:
也是大家的問題

有這個情形請打免費電話控巴控控 控九逆 控控控毆飛

0
逮丸逮丸
iT邦大師 1 級 ‧ 2013-08-22 08:48:43

iT邦幫忙MVPwiselou提到:
當時之所以不想把圖檔儲存成檔案,是為了避免多人使用時的檔案鎖定問題

即然圖檔不需存下來,如果圖檔沒有太複雜,
或者圖檔裡面沒有什麼敏感資料的話,
那就只要吐出有參數的url叫 Google Charts

若 google charts 無法符合原需求,自己畫比較簡單的話,
把 render 出來的圖,獨立成一個接受參數畫出來的 url,
然後在 dialog 裡去 query 這圖的 url,
也許就能從 web 的 log 看到有沒有在做 圖形的 query。

0
丁丁 (Dean)
iT邦大師 6 級 ‧ 2013-08-22 10:19:03

我之前曾處理 ASP.net 的圖型認證(就是畫面出現小小亂數認證碼,防Bot)
是用 ASHX 泛型處理來呈現圖型認證, 樓主也可以試看看...
不過 ASP.net MVC 沒用過~找篇參考文給您看看
利用泛型處理常式(ashx) 實作 .Net MVC 2 的圖形驗證功能

外獅佬 iT邦大師 1 級 ‧ 2013-09-03 00:19:32 檢舉

asp.net webform application 這招好使...但...mvc...常出問題落寞

0
fillano
iT邦超人 1 級 ‧ 2013-08-22 15:01:44

搞不好是瀏覽器的因素,只要url沒變,他就不會去更新已經cache起來的圖檔。可以試是在圖檔url後面加一個隨機變化的參數看看。

ted99tw iT邦高手 1 級 ‧ 2013-08-22 15:08:39 檢舉

iT邦幫忙MVPfillano提到:
參數

這季節就試試這個... "&password=翁嗎尼貝妹哞"暈

fillano iT邦超人 1 級 ‧ 2013-08-22 15:12:20 檢舉

從楞嚴咒隨機撈,變化比較多。

外獅佬 iT邦大師 1 級 ‧ 2013-09-03 00:17:22 檢舉

拍手...大師說的有道理...

0
player
iT邦大師 1 級 ‧ 2013-08-22 15:09:43

我報表的作法是View裡放iframe
然後View裡的表單post到這個iframe去
然後處理的Action送出CrystalReport的內容

不過你的問題是指瀏覽器快取嗎?
如果是的話, 用這個看看
Response.Cache.SetCacheability(HttpCacheability.NoCache);

我之所以不考慮用Google Charts
是因為免費的第三方服務
不知道能用到幾時?
在過去有一堆免費的網路服務, 說停就停
一點保障也沒有
一旦你用了它們, 要移植到其他的報表也沒那麼容易了

0
temo
iT邦新手 1 級 ‧ 2013-08-22 16:30:13

以前遇過類似的問題,後來找人幫忙解決
印象是dialog包住後不會主動更新圖表,要關閉再開才會
忘記怎麼解決的汗

ted99tw iT邦高手 1 級 ‧ 2013-08-22 16:38:28 檢舉

會是手動解決的嗎...冷

外獅佬 iT邦大師 1 級 ‧ 2013-09-03 00:18:03 檢舉

temo提到:
關閉再開才會

我的問題是...必須離開該頁才會...落寞

0
外獅佬
iT邦大師 1 級 ‧ 2013-08-22 20:38:58

整個frame只有那個圖表的action沒有更新
下中斷點在圖表的action,根本沒被執行……落寞

temo iT邦新手 1 級 ‧ 2013-08-23 12:27:03 檢舉

後來翻翻記錄,我那個是給圖表塞一個session還是什麼,就是在網頁重新整理時給他強制更新執行

我要留言

立即登入留言