問題說明:ASP.NET應用程式執行中出現'WebForm_PostBackOptions' 未被定義的錯誤訊息,該怎麼辦?
問題分析:最近有個機會需要將MySQL的日期資料轉為MsSQL的日期資料,在未查明MySQL的日期資料型別前;直接使用long.Paser的Method將資料解析為數值後,直接new DateTime(long),結果就出現了致命性的錯誤;不但AJAX出現下面的問題:
訊息: 語法錯誤
行: 1
字元: 1
程式碼: 0
URI: http://master.cursorinfo.com.tw:7000/AideRegister/WebResource.axd?d=5-EZy3-7lrBUw0173cFa5A2&t=633813918869843750
而且,
ASP.NET應用程式執行中出現'WebForm_PostBackOptions' 未被定義的錯誤。
請教微軟技術諮詢中心沈先生後得到的解答是:
您的錯誤訊息應是頁面直接報錯,目前看來時間戳記是上周四,造成程式碼有問題,可能Web Server上的時間有誤。
沒錯,就是ASP.NET的時間戳記出現了混淆的狀態。
解決方案:
依據沈先生建議,在網路上搜尋解決方案,得到的正解是:重新安裝.NET Framework 2.0即可。
可是重新安裝.NET Framework 2.0有些步驟須注意,因此,將相關方法說明如下,提供有此需求者減少摸索的時間。
重新安裝.NET Framework 2.0步驟:
1.開起系統控制台的新增移除程式,確定已安裝的.NET Framework 2.0的版本。
2.下載該版本的可轉散發套件。
3.將該套件解壓縮在已知的路徑待用。
4.找到新增移除程式中的.NET Framework 2.0,點選這個套件後,在更新的資料中,找到『按這裡取得資源資訊』,然後在彈出的視窗中,找到『修復』按鈕。
5.點選修復按鈕後,進行修復工作。如果原安裝的解壓縮檔已刪除,系統會顯示瀏覽安裝來源的視窗,只要將檔案來源指向剛才解壓縮後的資料夾,即可進行修復工作。
後記:
1.詳查網路資源後,才知道MySQL的日期資料,是unix日期型別,只要使用FROM_UNIXTIME()的函數,就可以解析該日期資料。(MySQL支援該函數)
2.MySQL發佈了Connector元件,可以讓.NET輕鬆存取MySQL資料庫;相當不錯的元件。Thanks.
2009年6月25日 星期四
2009年6月16日 星期二
Events in ASP.NET Master and Content Pages
Master page controls Init event.
Content controls Init event.
Master page Init event.
Content page Init event.
Content page Load event.
Master page Load event.
Master page controls Load event.
Content page controls Load event.
Content page PreRender event.
Master page PreRender event.
Master page controls PreRender event.
Content page controls PreRender event.
Master page controls Unload event.
Content page controls Unload event.
Master page Unload event.
Content page Unload event.
Source Url:http://msdn.microsoft.com/en-us/library/dct97kc3.aspx
Content controls Init event.
Master page Init event.
Content page Init event.
Content page Load event.
Master page Load event.
Master page controls Load event.
Content page controls Load event.
Content page PreRender event.
Master page PreRender event.
Master page controls PreRender event.
Content page controls PreRender event.
Master page controls Unload event.
Content page controls Unload event.
Master page Unload event.
Content page Unload event.
Source Url:http://msdn.microsoft.com/en-us/library/dct97kc3.aspx
2009年4月24日 星期五
ASP.NET無接縫傳值頁面處理後續-如何重新整理來源頁面?
問題說明:
當我們使用了無接縫傳值撰寫模式,完成Master/Detail的編修資料後,大部份的情況都需要重新整理來源頁的頁面,才能立即顯示修正後的資料。在這種情況下要如何處理?
可能方法包含:
1.使用window.opener.location.reload();
2.呼叫來源頁的重整功能。
這兩個方法中,window.opener.location.reload();會產生是否要重整的確認視窗,而且整個網頁重新進入一次,使用上比較不經濟。第二個方法可以配合AJAX把握重點,只整理需要的頁面。
個人習慣使用第二種方法。
我的作法:
1.在來源頁上配置一個ImageButton的Control。語法如下:
<asp:imagebutton id="refreshBU" alternatetext="頁面重整" imageurl="~/Images/refresh.png" oncommand="refreshBU_Command" runat="server">
2.加入一個doRefresh()的javascript function(),語法如下:
function doRefresh() { doClickId("<%=refreshBU.ClientID %>"); }
doClickId()在ASP.NET無接縫傳值撰寫模式中已建立。
3.撰寫refreshBU_Command事件處理機制,可能是重新Binding GridView。
4.彈出的頁面中加入編修或處理結束後來源頁的功能呼叫。語法如下:
<script type="text/javascript">
function confirmSave(){
alert('回應資料已存檔,頁面即將關閉!');
window.opener.doRefresh();
window.open('', '_parent', '');
window.close();
}
</script>
當我們使用了無接縫傳值撰寫模式,完成Master/Detail的編修資料後,大部份的情況都需要重新整理來源頁的頁面,才能立即顯示修正後的資料。在這種情況下要如何處理?
可能方法包含:
1.使用window.opener.location.reload();
2.呼叫來源頁的重整功能。
這兩個方法中,window.opener.location.reload();會產生是否要重整的確認視窗,而且整個網頁重新進入一次,使用上比較不經濟。第二個方法可以配合AJAX把握重點,只整理需要的頁面。
個人習慣使用第二種方法。
我的作法:
1.在來源頁上配置一個ImageButton的Control。語法如下:
<asp:imagebutton id="refreshBU" alternatetext="頁面重整" imageurl="~/Images/refresh.png" oncommand="refreshBU_Command" runat="server">
2.加入一個doRefresh()的javascript function(),語法如下:
function doRefresh() { doClickId("<%=refreshBU.ClientID %>"); }
doClickId()在ASP.NET無接縫傳值撰寫模式中已建立。
3.撰寫refreshBU_Command事件處理機制,可能是重新Binding GridView。
4.彈出的頁面中加入編修或處理結束後來源頁的功能呼叫。語法如下:
<script type="text/javascript">
function confirmSave(){
alert('回應資料已存檔,頁面即將關閉!');
window.opener.doRefresh();
window.open('', '_parent', '');
window.close();
}
</script>
2009年4月20日 星期一
一個關於ASP.NET RadioButtonList 控制元件操作上的注意事項
問題說明:
在ASP.NET的環境中操作RadioButtonList 控制元件時,如果在伺服端預設SelectedIndex時;例如設定了SelectedIndex=0,當使用者於網頁上點選第一項以外的選項時,SelectedIndexChanged的事件可以正常運作,但時回點第一項選項時發現無法啟動SelectedIndexChanged的事件。
也就是說在伺服端預設的SelectedIndex後,會導致該選項沒有SelectedIndexChanged的事件。
解決方法:
必須於網頁OnLoad或OnFocus時,使用Javascript定義預設的選項,不能在伺服端預設選項。
下面是我的作法:
window.onfocus = function() {
var ctrl = document.getElementById("<%=RadioButtonList1.ClientID%>" + "_0");
ctrl.checked = true;
};
在ASP.NET的環境中操作RadioButtonList 控制元件時,如果在伺服端預設SelectedIndex時;例如設定了SelectedIndex=0,當使用者於網頁上點選第一項以外的選項時,SelectedIndexChanged的事件可以正常運作,但時回點第一項選項時發現無法啟動SelectedIndexChanged的事件。
也就是說在伺服端預設的SelectedIndex後,會導致該選項沒有SelectedIndexChanged的事件。
解決方法:
必須於網頁OnLoad或OnFocus時,使用Javascript定義預設的選項,不能在伺服端預設選項。
下面是我的作法:
window.onfocus = function() {
var ctrl = document.getElementById("<%=RadioButtonList1.ClientID%>" + "_0");
ctrl.checked = true;
};
2009年3月27日 星期五
網頁輸入頁面Enter鍵處理元件(KeyDownProcess Version:1.1)
function KeyDownProcess() {
//-----------------------------------------------------------
//網頁親和性輸入控制元件
//元件功能:可以讓網頁資料的輸入更親切,功能如下:
//1.按下Enter鍵自動找到下一個可輸入輸入元件
//2.按下Enter鍵自動找尋submit按鍵,如果找到則模擬Click的功能
//版本:1.1(2009.03.27)
//作者:科碩資訊有限公司
//引用本元件,請保留作者和版本資訊
//聯絡mail:cursor@cursorinfo.com.tw
//------------------------------------------------------------
var kv = 0;
var rv = false;
var isTextarea = false;
var currentId = null; //目前元件
if (document.all && typeof (document.all) == "object") {
kv = event.keyCode;
isTextarea = (event.srcElement.tagName == "TEXTAREA");
currentId = event.srcElement.id;
}
else {
kv = evt.keyCode;
isTextarea = (evt.target == "TEXTAREA");
currentId = evt.id;
}
switch (kv) {
case 13:
if (currentId.length == 0)
return false;
if (isTextarea == true) {
rv = isTextarea;
}
else {
var cts = document.all && typeof (document.all) == "object" ? document.all : document.getElementsByTagName('input');
var cid = "";
var queryBu = null;
var beginNext = false; //開始比對是否為輸入元件
var nextInput = null; //下一個輸入元件
var specialSubmitId = "logonBU"; //指定特例的submit id
var exceptionSubmitId = "waitting"; //指定例外的submit Id
for (ii = 0; ii < cts.length; ii++) {
if (cts[ii].id == currentId) {
beginNext = true;
continue;
}
if (beginNext == true && (cts[ii].id.indexOf(specialSubmitId) > -1 || (cts[ii].type == "submit" && cts[ii].id.indexOf(exceptionSubmitId) == -1))) {
queryBu = cts[ii]; //找到submit元件
break;
}
else if (beginNext == true && (cts[ii].type == "text" || cts[ii].type == "textarea" || cts[ii].type == "password") && cts[ii].readOnly == false && cts[ii].style.display != "none") {
nextInput = cts[ii]; //找到下一個文字輸入元件
break;
}
}
if (null != queryBu) {
setTimeout("doClickId('" + queryBu.id + "');", 100);
rv = false;
}
else if (null != nextInput) {
try {
nextInput.focus();
} catch (Error) { return true; }
rv = false;
}
}
break;
default:
rv = true;
break;
}
return rv;
}
//實做模擬Click的功能
function doClickId(source) {
var o=document.getElementById(source);
if (document.all && typeof (document.all) == "object") //IE
o.click();
else {
var e = document.createEvent('mouseEvent');
e.initEvent('click', false, false);
o.dispatchEvent(e);
}
}
//-----------------------------------------------------------
//網頁親和性輸入控制元件
//元件功能:可以讓網頁資料的輸入更親切,功能如下:
//1.按下Enter鍵自動找到下一個可輸入輸入元件
//2.按下Enter鍵自動找尋submit按鍵,如果找到則模擬Click的功能
//版本:1.1(2009.03.27)
//作者:科碩資訊有限公司
//引用本元件,請保留作者和版本資訊
//聯絡mail:cursor@cursorinfo.com.tw
//------------------------------------------------------------
var kv = 0;
var rv = false;
var isTextarea = false;
var currentId = null; //目前元件
if (document.all && typeof (document.all) == "object") {
kv = event.keyCode;
isTextarea = (event.srcElement.tagName == "TEXTAREA");
currentId = event.srcElement.id;
}
else {
kv = evt.keyCode;
isTextarea = (evt.target == "TEXTAREA");
currentId = evt.id;
}
switch (kv) {
case 13:
if (currentId.length == 0)
return false;
if (isTextarea == true) {
rv = isTextarea;
}
else {
var cts = document.all && typeof (document.all) == "object" ? document.all : document.getElementsByTagName('input');
var cid = "";
var queryBu = null;
var beginNext = false; //開始比對是否為輸入元件
var nextInput = null; //下一個輸入元件
var specialSubmitId = "logonBU"; //指定特例的submit id
var exceptionSubmitId = "waitting"; //指定例外的submit Id
for (ii = 0; ii < cts.length; ii++) {
if (cts[ii].id == currentId) {
beginNext = true;
continue;
}
if (beginNext == true && (cts[ii].id.indexOf(specialSubmitId) > -1 || (cts[ii].type == "submit" && cts[ii].id.indexOf(exceptionSubmitId) == -1))) {
queryBu = cts[ii]; //找到submit元件
break;
}
else if (beginNext == true && (cts[ii].type == "text" || cts[ii].type == "textarea" || cts[ii].type == "password") && cts[ii].readOnly == false && cts[ii].style.display != "none") {
nextInput = cts[ii]; //找到下一個文字輸入元件
break;
}
}
if (null != queryBu) {
setTimeout("doClickId('" + queryBu.id + "');", 100);
rv = false;
}
else if (null != nextInput) {
try {
nextInput.focus();
} catch (Error) { return true; }
rv = false;
}
}
break;
default:
rv = true;
break;
}
return rv;
}
//實做模擬Click的功能
function doClickId(source) {
var o=document.getElementById(source);
if (document.all && typeof (document.all) == "object") //IE
o.click();
else {
var e = document.createEvent('mouseEvent');
e.initEvent('click', false, false);
o.dispatchEvent(e);
}
}
2009年3月16日 星期一
ADSI技術文章-使用WinNT Provider取得User的Groups
public Dictionary GetWinNtUserGroups(string userName, string uName, string pwd)
{
Dictionary rv = new Dictionary();
string adsPath = string.Format("WinNT://{0}/{1},user", Environment.MachineName, userName);
if (DirectoryEntry.Exists(adsPath) == true)
{
DirectoryEntry user = new DirectoryEntry(adsPath, uName, pwd);
IADsGroup ig;
//叫用 Group 的 Members
object groups = user.Invoke("Groups", null);
DirectoryEntry gEntry;
foreach (object go in (IEnumerable)groups)
{
gEntry = new DirectoryEntry(go);
if (gEntry.SchemaClassName.ToLower() == "group")
{
ig = (IADsGroup)gEntry.NativeObject;
rv.Add(ig.Name, ig.Description);
}
}
}
return rv;
}
{
Dictionary
string adsPath = string.Format("WinNT://{0}/{1},user", Environment.MachineName, userName);
if (DirectoryEntry.Exists(adsPath) == true)
{
DirectoryEntry user = new DirectoryEntry(adsPath, uName, pwd);
IADsGroup ig;
//叫用 Group 的 Members
object groups = user.Invoke("Groups", null);
DirectoryEntry gEntry;
foreach (object go in (IEnumerable)groups)
{
gEntry = new DirectoryEntry(go);
if (gEntry.SchemaClassName.ToLower() == "group")
{
ig = (IADsGroup)gEntry.NativeObject;
rv.Add(ig.Name, ig.Description);
}
}
}
return rv;
}
ADSI技術文章-使用WinNT Provider取得User的Groups
問題說明:
如果我們想使用WinNT Provider,取得user的群組清單,應該如何做呢?
下面範例會傳回一組群組名稱和描述的Dictionary資料:
public Dictionary GetWinNtUserGroups(string userName, string uName, string pwd)
{
Dictionary rv = new Dictionary();
string adsPath = string.Format("WinNT://{0}/{1},user", Environment.MachineName, userName);
if (DirectoryEntry.Exists(adsPath) == true)
{
DirectoryEntry user = new DirectoryEntry(adsPath, uName, pwd);
IADsGroup ig;
//叫用 User 的 Groups
object groups = user.Invoke("Groups", null);
DirectoryEntry gEntry;
foreach (object go in (IEnumerable)groups)
{
gEntry = new DirectoryEntry(go);
if (gEntry.SchemaClassName.ToLower() == "group")
{
ig = (IADsGroup)gEntry.NativeObject;
rv.Add(ig.Name, ig.Description);
}
}
}
return rv;
}
*使用IADsGroup的COM介面,可以輕鬆取得group的屬性。
*使用IADsGroup的COM介面,須參考ActiveDs.dll。
如果我們想使用WinNT Provider,取得user的群組清單,應該如何做呢?
下面範例會傳回一組群組名稱和描述的Dictionary資料:
public Dictionary
{
Dictionary
string adsPath = string.Format("WinNT://{0}/{1},user", Environment.MachineName, userName);
if (DirectoryEntry.Exists(adsPath) == true)
{
DirectoryEntry user = new DirectoryEntry(adsPath, uName, pwd);
IADsGroup ig;
//叫用 User 的 Groups
object groups = user.Invoke("Groups", null);
DirectoryEntry gEntry;
foreach (object go in (IEnumerable)groups)
{
gEntry = new DirectoryEntry(go);
if (gEntry.SchemaClassName.ToLower() == "group")
{
ig = (IADsGroup)gEntry.NativeObject;
rv.Add(ig.Name, ig.Description);
}
}
}
return rv;
}
*使用IADsGroup的COM介面,可以輕鬆取得group的屬性。
*使用IADsGroup的COM介面,須參考ActiveDs.dll。
訂閱:
文章 (Atom)