2012年11月9日 星期五

關於 Reporting Service 的報表資料

不管是使用 SQL Server 的 Business Intelligence Development Studio 或是 Visual Studio 2012 開發 Reporting Service 報表,應該對於報表資料  (Report Data) 這視窗不陌生。


可是,當我不小心按了「X」把他關閉後,卻再也怎麼找不回來了。找了好久才發現,要呼叫他之前竟還要先做一個動作。首先,必須先將專案裡的任何一支報表打開,然後在該報表的設計頁面點一下,主要是讓設計頁面目前是被聚焦(focus)的,這時,再點選最上面功能列裡的「檢視(View)」,在檢視頁籤中,最下面就會出現「報表資料(Report Data)」,點選後就可以找回自己的報表資料視窗了。

關於要在「檢視」功能列中出現「報表資料」選項,還得先點選設計頁面才行的作法,這 UI 的設計邏輯真的會讓人混淆,或許不需這麼複雜,永遠都出現在「檢視」功能列中不就好了嗎?而且加上這限制,還真的想不出有何特別意義。

參考:
01:停駐報表設計師中的報表資料窗格 (SSRS)

2012年11月6日 星期二

由VS2003 升級後的專案無法使用 Update Panel

將專案從 VS2003 升級到 VS2005 後,原本想要試試微軟新功能 Update Panel,但竟然一點效果也沒有,是不是我哪裡弄錯了呢?自己也是照著書本上一行一行打的啊?於是在 google 上開始打著 Update Panel 無路用之類的關鍵字,哈哈,還竟然真的查到許多人在討論這件事。

原來這故事,要從 XHTML 開始說起。話說 HTML 稱霸網壇數十年早已不是甚麼新鮮事,他嚴然已成為一種標準通用的標記語言,但他的缺點就是太鬆散了。大小寫不分,有沒有結束的封閉符號也不管,人這麼聰明,看懂是沒問題,但機器這麼笨,大寫小寫傻傻分不清楚。美其名是為了提昇機器的效率,其實是掩蓋機器沒那麼聰明的事實,所以大家訂了一個更嚴格的約定,都用小寫、一定要有封閉符號...,諸如此類的規定,只是為了讓機器能夠減少去做多餘的判斷,快速的達成我們所要的結果。這項別稱為近代人類的不平等條約,就是 XHTML(詳見:wiki 說明的 XHTML)。


目前 XHTML 的版本大致分為以下幾類:

  • XHTML 1.0 Strict(嚴格版): 是參照「HTML 4.01 Strict」改編,但不包括被棄用的元素。
  • XHTML 1.0 Transitional(過渡版): 是參照「HTML 4.01 Transitional」改編,包括已於Strict版本被棄用的呈現性元素(例如<center>, <font>等)。
  • XHTML 1.0 Frameset(框架版): 是參照「HTML 4.01 Frameset」改編,並允許於網頁中定義框架元素。
  • XHTML 1.1
  • XHTML Basic
然而,在微軟 .Net 1.0 、.Net 1.1 的年代裡,還是依循著早期 HTML 的快樂好日子,我的程式也是隨便寫寫,他也睜一隻眼閉一隻眼讓我過。但好景不常,隨著 .Net 2.0 降臨,開始要求要符合 XHTML 的規範,這也難怪從 VS2003 升級到 VS2005 後的程式碼,處處可見紅字。

如果專案是從 .Net 1.0、.Net 1.1 透過自動升級精靈升級到 2.0 以後的版本,為了讓先前已經寫好的程式能夠順利的渡過這青黃不接的階段,微軟提出了三種方案讓你選擇,而這個設定,就是在 web.config 檔裡的 xhtmlConformance。這三種方案分別是:


  • Legacy:他就如同早期 .net 1.0、.net 1.1 的 HTML 規範,並不會去限制你一定要遵守 XHTML 的規定。
  • Transitional:他表示要符合等同 XHTML 1.0 Transitional 的規範
  • Strict:他表示要符合更嚴格的 XHTML 1.0 Strict 的規範

而我們升級過後的專案,為了要能夠向下相容、無痛升級,所以就會主動在我們的 web.config 上加上一行:
<system.web>
      <xhtmlConformance mode="Legacy" />
</system.web>

很不巧地,我想要使用的 Update Panel 功能,他卻只能在 Transitional 與 Strict 的模式下才能執行,這也正是為何透過升級而來的專案,會出現 Update Panel  無法正常使用的狀況。所以,這時的處理方式,可以透過修改 xhtmlConformance ,將其改為 Transitional 或 Strict ,就可以讓 Update Panel 正常使用了!如果你看 xhtmlConformance 不順眼,刪了他也是可以,因為他的預設值是 Transitional。

參考:
01:XHTML
02:ASP.NET AJAX & XHTML Conformance
03:Gotcha: Don't use <xhtmlConformance mode="Legacy"/> with ASP.NET AJAX
04:.NET 2.0 Update Panel won't perform partial postbacks on upgraded 1.1 sites

2012年11月5日 星期一

一場誤會

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="jsTest.aspx.cs" Inherits="WebApplication1.jsTest" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="http://code.jquery.com/jquery-1.6.4.min.js"></script>    
  
</head>
<body>
    <form id="form1" runat="server">
    <div>
昔誰持種來 而今佳色開<br>
昔誰持種來 而今佳色開<br>
昔誰持種來 而今佳色開<br>
    </div>

    <script>alert('提示訊息');</script>


    </form>
</body>
</html>

如上很簡單的 HTML 語法,只是好奇的想知道,是先跳出 javascript 的「提示訊息」呢,還是會先顯示「昔誰持種來 而今佳色開」的說明呢?我覺得在剖析 HTML 時,是由上而下的順序,應該會先顯示文字說明,而 javascript 是擺在最後面,所以會放到後面才執行。不只我這麼說,別人也是如是說,請看:「Load and execution sequence of a web page?」對於 mauris 所解釋的內容,真的非常詳細。

但我在 IE8 瀏覽結果時,卻出現如下結果:

而 chrome 與 firefox 則是如下(以 chrome 為例):

這說明了,以上面的範例來說,IE8 是先執行 javascript ,然後再對文字說明做處理;相反地,Chrome 與 FireFox 則是先對文字說明做處理,然後再執行 javascript。但這樣的結果,還真的讓人很疑惑?於是我再測了一下 IE6,沒想到 IE6 的行為,竟然跟 chrome 與 firefox 是一樣的,難道 IE8 是怪胎嗎?或許把過錯都推給 IE8 還蠻多人會覺得理所當然,但直到有一天,我把 jQuery 的版本升級到 1.7.1 之後,IE8 的處理結果竟也跟其他瀏覽器都一致了。原來事情的始末,竟是 jQuery 1.6.4 的版本,造成 IE8 在執行 javascript 時的觸發順序都提到最前面了。

在尚未發現主要原因是 jQuery 版本所引起之前,我的作法是在 javascript 標籤屬性裡加上 defer:

<script defer>alert('提示訊息');</script>

defer 這關鍵字,僅支援 IE 瀏覽器,他會讓 javascript 的執行時間延遲到整個頁面都下載完成後才執行。對我而言,只要跳出訊息視窗時不讓背景畫面一片空白,也就可以了。只是沒想到,真正引發問題的原因竟是自己所使用的 jQuery 版本。

IE8,我錯了,請您原諒~



參考:
01:Load and execution sequence of a web page?
02:姚博文 Script中defer的作用
03:asp.net弹出信息框——没有用ScriptManager
04:HTML <script> 标签的 defer 属性