2009年6月30日 星期二

JavaScript 的 alert 是亂碼?如何解決 |

通常我們在寫程式時,會希望跳出一些訊息給使用者,但在我的實例中,遇到了跳出的視窗顯示為亂碼!!其代碼如下:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="950"%>
<%
Dim str
str="登入用戶名不能為空!"
if str<>"" then
response.Write "<script language=JavaScript>alert(""" & str & """);history.go(-1)</script>"
end if
%>

對不起,執行時都會出示亂碼,而不是中文字。(我的網頁採用utf-8編碼,並且在前端加上了Codepage指示詞)
經研究,這是沒有meta設定的關係。即使網頁最前端已有設定%@codepage=65001%,仍然沒用。有時,我的網頁結構特殊,不適合在找地方加上<meta>的設定時(如果可以直接加上meta設定,也可以解決這個問題),可以針對要alert之前,直接塞meta設定在前,這樣,顯示中文就會正常了!!修改如下:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
Dim strMeta
strMeta = "<meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"" />" '先把meta設定寫在變數strMeta中
str="登入用戶名不能為空!"
if str<>"" then
response.Write strMeta&"<script language=JavaScript>alert(""" & str & """);</script>" '直接加在java script之前,讓中文設定生效
end if
%>

就解決了

2009年6月22日 星期一

Asp.Net C# 加上 JavaScrip 開新視窗,列印

開新視窗,關閉工具列
ScriptManager.RegisterStartupScript(this, this.GetType(), "ALERT", "window.open('ABC.aspx','1234','top=100,left=100,width=720,height=740,toolbar=no');", true);

列印按鈕
ScriptManager.RegisterStartupScript(this, this.GetType(), "print", "javascript: window.print();", true);

彈出式訊息視窗
ScriptManager.RegisterStartupScript(this, this.GetType(), "ALERT", "alert('訊息');", true);

彈出式訊息視窗 + 確認後更換頁面
ScriptManager.RegisterStartupScript(this, this.GetType(), "ALERT", "alert('訊息!');window.location='ABC.aspx?A_Sno=1';", true);

2009年6月17日 星期三

具有潛在危險 Request.Form 的值已從用戶端偵測到

若是出現這樣的錯誤訊息,代表頁面上有文字內容是包含Html這類的語法,通常在使用一些Html的編輯器(留言板、討論區之類常用)做資料送出的動作的時候會發生。

解決辦法如下:

在頁面的Page指示語加入 validateRequest="false"

Ex:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" validateRequest="false" %>

2009年6月16日 星期二

C# (ascx) usercontrol互相傳值

話說兩個不相信任的政黨..要互相移交政權..要好好的傳地下去..是有點給它難..
話說兩個不相關的usercontrol要互相丟值接值..感覺起來也是不怎麼好用..

google一下..可以發現有人提供一些方法..像interface這樣很正統的解決方法..不過.. 真的有點給它努力認真研究.. 才可以給它懂(我就是這樣懂的....) 如果看不懂或是想偷懶..那有啥方法呢?..有低..session..application都可以解決..

textbox.ascx..這一個usercontrol放一個textbox和一個button
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="textbox.ascx.cs" Inherits="usercontrol_textbox" %>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />

textbox.ascx.cs
protected void Page_Load(object sender, EventArgs e)
{

}
protected void Button1_Click(object sender, EventArgs e)
{
HttpContext.Current.Items["textbox"] = TextBox1.Text;
}

label.ascx..這一個usercontrol放一個label
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="label.ascx.cs" Inherits="usercontrol_label" %>
<asp:Label ID="Label1" runat="server" Text=""></asp:Label>

label.ascx.cs
protected void Page_Load(object sender, EventArgs e)
{

}
void Page_PreRender(object sender, EventArgs e)
{
Label1.Text = (string)HttpContext.Current.Items["textbox"];
}

CurrentItems.aspx..這裡把兩個usercontrol放進來..

<form id="form1" runat="server">
<div>
<uc1:textbox ID="textbox1" runat="server" />
<br />
<uc2:label ID="label1" runat="server" />
</div>
</form>

執行就可以抓到值啦
這裡就是用HttpContext.Current.Items["abc"]這東西..

參考:
http://msdn2.microsoft.com/zh-tw/library/system.web.httpcontext.items.aspx

(asp net)(c#) 讀取文字檔

asp net
一行一行的取讀取文字檔內的資料,並將所取的值回傳
Private Function GetTextString() As String
Dim value As String = ""
'Dim a As String = ""
Dim MySF As IO.StreamReader = New IO.StreamReader("c:1.txt", System.Text.Encoding.Default)
'value = MySF.ReadToEnd()
'讀取全部會包含換行符號
Do While Not MySF.EndOfStream
'讀取單行
value = MySF.ReadLine
Loop
Return value
End Function

c#
一行一行的取讀取文字檔內的資料
StreamReader stmRdr = new StreamReader("TextFile1.txt");

string line = stmRdr.ReadLine();
while(line != null) {
Console.WriteLine(line);
line = stmRdr.ReadLine();
}

2009年6月15日 星期一

好用的 MS SQL 2005 欄位字串加密應用 ( MD5 與 SHA1 )

MS SQL 2005 字串加密函式 -- HashBytes

HashBytes提供的加密法有幾種 (MD2、MD4、MD5、SHA、SHA1 ),但最常使用的還是 MD5 與 SHA1。而整個使用過程的感覺來說,基本上還算簡單~只是有一些"眉角"要注意。首先先測試 HashBytes 運作是否合乎需求:

select hashbytes('MD5','12345') as MD5,hashbytes('SHA1','12345') as SHA1

2009年6月13日 星期六

FLASH與ASP間的資料傳遞

要用FLASH和ASP作互動(client端&server端之連結)
讓使用者輸入ID,將ID傳到ASP,再從ASP把值傳回來。
(軟體分別使用Flash MX2004 和 Visual Web Developer 2008 Express版)

想法:
用FLASH第一個影格裡製作一個文字輸入欄(id_txt)和按鈕(ok_btn),輸入文字按下按鈕後,即可將所輸入的文字傳到ASP的Label。
ASP再將值傳回FLASH的第二個影格的動態文字框(receive_mc)。
-----------------第一個影格時間軸程式碼--------------------
stop();
var username = new LoadVars();
id_txt.onData = function(){
}
ok_btn.onRelease = function() {
loadVariables(Default.aspx, post);
_root.gotoAndPlay(2);
}
--------------------------------------------------------------------------

-----------第二個影格的動態文字框接收傳回值-----------

onClipEvent(load)
{
CurrentRecord = 0;
loadVariables ("Default.aspx", get);
}
onClipEvent(data)
{
strusername=username;
strPosition = "Record " add String(CurrentRecord+1) add " of " add String(TotalRecords);
}
--------------------------------------------------------------------------

--------------------------ASP的Label內容--------------------------
Partial Class _Default
Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim id_txt As String = ""
id_txt = Request("id_txt")
Response.Write(id_txt)
End Sub

End Class
--------------------------------------------------------------------------

改用下面的方法
var result_lv:LoadVars = new LoadVars();//先宣告一個容器用來接收資料
result_lv.onLoad = function(success:Boolean) {
if (success) {//如果載入成功
result_ta.text = result_lv.welcomeMessage;//result_lv是容器、welcomeMessage是傳回的變數 (請依實際情況做修改)
} else {//如果載入失敗
result_ta.text = "連線失敗";
}
};
var send_lv:LoadVars = new LoadVars();//宣告一個容器存放要傳出的資料
send_lv.name = name_ti.text;//send_lv是容器、name是要傳出的變數名稱 (請依實際情況做修改)

下面這一行你可以寫在按鈕的 onRelease 裡

send_lv.sendAndLoad("filename.asp",result_lv,"POST");

ASP的部份
你要接收 POST 進來的 name 變數,然後做你想做的處理
要傳資料給FLASH
就把資料輸出到頁面上、FLASH就會接收到

輸出的格式如下
變數名稱=值
如果有多個變數就用 & 分隔
變數名稱1=值&變數名稱2=值&變數名稱3=值

不要輸出不必要的東西在畫面上

Q:要怎麼把值丟進去?
A:上面的程式碼就可以將資料丟給ASP。

Q:他要怎麼接收flash丟出來的值?
看你貼的程式碼、我以為你會寫ASP
ASP不是我的專長、但我搜尋的結果應該是下面這句

Request.Form("變數")

如果FLASH傳出來的變數叫做 name
那ASP就用Request.Form("name")取得傳入的資料

2009年6月8日 星期一

Core Temp-CPU溫度偵測軟體

Core Temp的特點:

體積小,免安裝,是一款綠色軟體。
支援AMD與Intel新一代的CPU,詳細的資料請參考以下網址http://www.alcpu.com/CoreTemp/supportlist.html。

能設定單獨顯示最高溫度核心或是所有核心的溫度。
能設定溫度數據的顏色,也可設定溫度數據的背景顏色。
可以設定以毫秒ms為單位的偵測間隔。
除了溫度,還能顯示CPU的名稱、封裝方式、電壓、核心速度等資訊。

軟體名稱:Core Temp

官方網站::http://www.alcpu.com/CoreTemp/
下載網址:http://www.alcpu.com/CoreTemp/
--------------------------------------------------------------------------
HWMonitor由推出CPU-Z的CPUID推出,是一款好評率極高的CPU溫度偵測軟體,具有免費、免安裝的優點。當然,這個CPU溫度偵測軟體的功能不僅僅只是偵測CPU溫度,它還可以偵測硬碟、CPU風扇轉速、顯示卡溫度、CPU電壓的使用變化紀錄、電源供應器的溫度變化,最讚的是這個CPU溫度偵測軟體免費下載來用還可以直接調整風扇的轉速,如果CPU溫度不高,那將風扇轉速調低點豈不安靜多了,而且還能省下少少電費,延長風扇的少少壽命呢!

HWMonitor的優點小結:
@ HWMonitor是個免費軟體,用得安心!
@ 繼承了免安裝的優良傳統,所以此CPU溫度偵測軟體用得也省心!
@ 透過傳感器可以即時呈現各項硬體的溫度變化,包括CPU、硬碟、風扇轉速、顯示卡溫度、電壓的使用變化紀錄、電源供應器的溫度變化等。
@ 此CPU溫度偵測軟體還可以直接調整風扇的轉速。

下載網址: http://www.cpuid.com/hwmonitor.php
官方網站: http://www.cpuid.com/
--------------------------------------------------------------------------
SpeedFan這個CPU溫度偵測軟體可以即時顯示CPU溫度、電壓與主頻、佔用率、硬碟溫度與健康、風扇轉速、電池電量、開機時間等重要系統資訊,還具備讀取硬碟溫度與SMART資訊等功能。它不同於別的CPU溫度偵測軟體,除了能顯示以上資訊,它還可以根據晶片溫度來設定不同的風扇速度。

如何使用SpeedFan?
@ 依以下位址下載最新版免費CPU溫度偵測軟體SpeedFan,然後安裝。
@ 安裝成功後啟動SpeedFan,首次啟動它會自動檢測電腦的硬體情況。
@ 你可以自動調整風扇速度,即在“Automatic fan speed”前打勾,這樣比較省事,這也算是此CPU溫度偵測軟體的優點之一吧。
@ 也可以選擇手動調整風扇速度,但不太推薦,除非你很在行,不怕麻煩。

下載網址: http://www.almico.com/sfdownload.php
官方網站: http://www.almico.com/

2009年6月2日 星期二

C# 做流水號時,不滿位數補零(0)

在寫產生流水號的時候,需求是 9 Char 位數。
可是資料不滿的時候要怎麼來補滿呢?
string show4_5 = string.Format("{0,1:000000000}",int.Parse(PLT_QTY_FIRST)); //數量不滿 9 位數時,前面補 0

//很多 0 那裡是指定總位數是多少。
//後面的 PLT_QTY_FIRST 是指原本的變數 ,就是原本的水號。

結果:
初值 PLT_QTY_FIRST = 999
show4_5 = 000000999

太機車。。。 竟然有更簡單的
int.Parse(PLT_QTY_FIRST).ToString("000000000");

blogger如何製作高品質html原始碼

前言:
在blogger的文章中,要呈現程式的原始碼,常會與本章的本文混在一起,版面也會被破壞。這裡有一個方法,可以使原始碼與本文清楚的區分。又能兼顧排版的整齊。

STEP BY STEP:
首先在blogger 的「版面配置」→「修改Htm」→「展開小裝置範本」打勾(不了解請參考本系列其他文章)

找到 css設定的部分,增加以下這一段css代碼:
code 
{ display: block;font-family: 'Courier New';font-size: 9pt;overflow: auto;border: 1px solid #ccc;padding: 10px 10px 10px 21px;max-height: 180px;line-height: 1.2em;letter-spacing: 0px;color: #000;background: #ccc url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkgzV1MygBv_QLonOH8CfYGAAQVKd1Jz8xloVSmkvMWl7B3n_5Ar_k8g7rRo5Ph0nHs4JvanhIkgKI3GjphFoxJQZPDl7QT2qVigK60MiHJ6Qlnbfl8R6OLuQhexUJ1ImlsFj5dcuKtA/) left top repeat-y;}


以後要顯示原始碼時,就這樣作:
<pre><code>....這裡放原始碼....</code></pre>
後記:

在 <code> 及 </code> 的html專用的標準符號要替換。可以用
Dreamweaver 自動幫我們轉換,將代碼貼到 Dreamweaver 的設計檢視上,
然後再切換到程式碼檢視,先用Dreamweaver的取代字串清掉<BR>,否則可能會多跳一行。把已經轉好的原始碼複製下來即可。

C# - 操作外部程式視窗

以下程式碼,透過 button1 控制項 Click 事件執行 ShowWindow() 方法,控制外部程式視窗狀態:包含最大化、最小化、縮到工具列、復原 等動作。

控制外部程序,請參考 Process 類別。

程式碼:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices; // to import Dll
using System.Windows.Forms;

namespace WordTest
{
public partial class Form1 : Form
{
public Form1( )
{
InitializeComponent( );
}
[DllImport( "User32" ) ]
private static extern int ShowWindow( int hwnd, int nCmdShow);
private enum CommandShow : int
{
SW_HIDE = 0,
SW_SHOWNORMAL = 1,
SW_NORMAL = 1,
SW_SHOWMINIMIZED = 2,
SW_SHOWMAXIMIZED = 3,
SW_MAXIMIZE = 3,
SW_SHOWNOACTIVATE = 4,
SW_SHOW = 5,
SW_MINIMIZE = 6,
SW_SHOWMINNOACTIVE = 7,
SW_SHOWNA = 8,
SW_RESTORE = 9,
SW_SHOWDEFAULT = 10,
SW_FORCEMINIMIZE = 11,
SW_MAX = 11
} ;
private static void button1_Click( object sender, EventArgs e)
{
Process[ ] p = Process.GetProcessesByName ( "notepad" );
if (p.Length > 0 )
{
int hwnd;
hwnd = p[ 0 ].MainWindowHandle.ToInt32 ( );
ShowWindow(hwnd, ( int ) CommandShow.SW_RESTORE );
}
}
}
}

C# 用 WebClient 模擬 IE 6.0 連線

//模擬 IE 6.0
WebClient wc = new WebClient( );
wc.Headers.Add ( "Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*" );
wc.Headers.Add ( "Accept-Language", "zh-TW" );
wc.Headers.Add ( "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" );
Stream s = wc.OpenRead (url);
StreamReader sr = new StreamReader(s, Encoding.UTF8 );
string result = sr.ReadToEnd ( );

利用 WebClient 類別,並加入一些 Header 就可以騙過一些網站,讓 Web Server 信以為真是真正的使用者來訪,而非 Web Spider。

C# - ASP.NET 2.0 另一種簡單寄信的方法

寫程式的人大多會用到,主文擷取微軟的MSDN,雖然微軟的MSDN讓許多人視之如廢材,但沒想到用了其他的SAMPLE問題一堆,微軟這個卻寫的還很清楚,修改過後相關寫法如下:

最一開始記得要先引用

using MailMessage=System.Net.Mail.MailMessage;

寄信相關寫法

{
//先取得設定寄件者MAIL與名稱 to 跟 From應該懂吧
MailAddress from = new MailAddress(要寄信的信箱, 寄件者顯示名稱);
MailAddress to = new MailAddress(mailAdd,"");
MailMessage message = new MailMessage(from, to);
//設定主題跟內文
message.Subject = "主旨";
message.Body = "內容";
//做UTF 8編碼 ,可做可不做啦
message.BodyEncoding = Encoding.UTF8;
message.SubjectEncoding = Encoding.UTF8;
//new 一個SMTP SERVER
SmtpClient client = new SmtpClient("你的SmtpServer"));
//設定驗證機制
NetworkCredential pa = new NetworkCredential("你要寄信的信箱帳號","密碼");
client.Credentials = pa;
//寄信
client.Send(message);
}

寄信寫法有多種,如要寄很多信建議用COPY 在CC的方式比較不會被認為大量寄信的垃圾郵件,相關寫法可參照微軟的MSDN,
連結如下:http://msdn.microsoft.com/zh-tw/library/system.net.mail.mailmessage(VS.80).aspx

另一種SMTP 簡單的寄信語法
using System.Net.Mail; 

string CMailA = "king@gmail.com.tw"; //收件者
string mailContent = "

*** 請注意︰此郵件是系統自動傳送,請勿直接回覆此郵件。***";

MailMessage messageA = new MailMessage("king@gmail.com.tw", CMailA, "【訊息】主旨", mailContent);
messageA.IsBodyHtml = true;
SmtpClient emailClientA = new SmtpClient("SMTP伺服器", 25);
NetworkCredential pa = new NetworkCredential("帳號", "密碼");
emailClientA.Credentials = pa;
emailClientA.Send(messageA);

C# - 利用 Gmail SMTP 幫你寄信

只要有 Gmail 個人帳號與密碼,透過 Gmail SMTP SSL 的認證,Gmail 就可以幫助你寄信囉!

該程式利用 MailAddress 建立收發信人的郵件位址,MailMessage 建立郵件相關內容,SmtpClient 與 NetworkCredential 建立 Smtp 連線認證與寄信功能。

程式碼:

using System;
using System.ComponentModel;
using System.Net;
using System.Net.Mail;
using System.Text;
using System.Windows.Forms;
namespace MyMail
{
public partial class Form1 : Form
{
public Form1( )
{
InitializeComponent( );
}
private void button1_Click_1( object sender, EventArgs e)
{
// Mail Message Setting
string fromEmail = "XXX@gmail.com";
string fromName = "C.H.Huang";
MailAddress from = new MailAddress(fromEmail, fromName, Encoding.UTF8 );
string toEmail = "YYY@gmail.com";
MailMessage mail = new MailMessage(from, new MailAddress(toEmail) );
string subject = "Test Subject";
mail.Subject = subject;
mail.SubjectEncoding = Encoding.UTF8;
string body = "Test Body";
mail.Body = body;
mail.BodyEncoding = Encoding.UTF8;
mail.IsBodyHtml = false;
mail.Priority = MailPriority.High;
// SMTP Setting
SmtpClient client = new SmtpClient( );
client.Host = "smtp.gmail.com";
client.Port = 587;
client.Credentials = new NetworkCredential( "username@gmail.com", "password" );
client.EnableSsl = true;
// Send Mail
client.SendAsync (mail, mail);
// Sent Compeleted Eevet
client.SendCompleted += new SendCompletedEventHandler(client_SendCompleted);
}
// Handle Sent Compeleted Eevet
private void client_SendCompleted( object sender, AsyncCompletedEventArgs e)
{
if (e.Error != null )
{
MessageBox.Show (e.Error.ToString ( ) );
}
else
{
MessageBox.Show ( "Message sent." );
}
}
}
}

特別要注意的是 Port, 一般都寫 465,
但實際試過 465 都不行, 網上寫 587,... 就口以!!

Dim smtp As New SmtpClient()
smtp.Host = "smtp.gmail.com"
smtp.Port = 587
smtp.Credentials = New System.Net.NetworkCredential("帳號", "密碼")
smtp.EnableSsl = True

Dim fromAddress As New MailAddress(strFromMail, strFromName)
Dim toAddress As New MailAddress(strToMail, strToName)
Dim mailMessage1 As New MailMessage(fromAddress, toAddress)

mailMessage1.Subject = "主旨"
mailMessage1.Body = "郵件內文"

Try
 smtp.Send(mailMessage1)
 mailMessage1.Dispose()
Catch ex As Exception
 Response.Write("ERROR!!")
End Try

smtp = Nothing

== 分隔線 ==

除了寄件外, 還必須了解 gmail l的一些限制,..

Gmail原來都有一定的限制。這些限制其實是避免有人利用Gmail在不軌的用途上。

首先,如果你透過Email Client,以POP或IMAP發電郵,一封郵件最多只可以發給100人,否則你的Gmail帳號便會被停用一天。

以Web Interface來用Gmail,這個限額就大很多──500人。但如果你發給500人以上,你的帳號可能會被停用24-72小時不等。

不過,一般用戶都應該衝不過100,甚至500這兩個大限。如果多於這大限,或許意味著發信人是個Spammer吧。

還有一個有趣的限制。如果一封郵件內有很多的失效電郵地址,會引致大量Bounce Back的話,你的帳號也可能會被停用。