牛腩給我的改變到現在來講可以說很多:思考方式,解決問題的辦法,和別人去交流。在看牛腩視頻的時候,看着都會,都很簡單,但是到自己在敲代碼的時候,卻是出現很多意想不到的結果。
看着別人學習牛腩就很簡單,但是自己在敲代碼的時候確實千瘡百孔,正是因爲這些問題,我感覺自己在解決問題,分析問題上成長。比如說,在剛來照着學生信息管理系統敲代碼的時候,那時候真心的就是沒什麼錯誤,最多也就是配置。但是要是但是問我那個是什麼,那個函數是幹什麼用的,我肯定是一頭霧水。
但是這次,因爲牛腩一次又一次的給我機會,讓我有機會去了解一些函數,邏輯,那裏出的錯誤。正是因爲這樣,解決問題的時間也比之前有效率了,最起碼是有目的地去調試代碼。
這次要將的就是我這個坎坷的驗證碼。這個功能是上午看的,下午看完整個新聞內容頁的整合之後纔去管他,因爲按照牛腩老師的講法,這個驗證碼無非就是調用一個函數,然後在前臺去掉用這個函數。
但是到了下午自己能就不是一回事兒了。
首先:實現驗證碼的代碼
一般處理程序中的代碼(自認爲後臺的一個函數):
<%@ WebHandler Language="C#" Class="WaterMark" %>
/*
* 創建人:李雪
* 創建時間:2014、09、14
* 版權所有:李雪
*/
using System;
using System.Web;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Web.SessionState;
public class WaterMark : IHttpHandler, IRequiresSessionState // 要使用session必須實現該接口,記得要導入System.Web.SessionState命名空間
{
public void ProcessRequest(HttpContext context)
{
string checkCode = GenCode(5); // 產生5位隨機字符
context.Session["Code"] = checkCode; //將字符串保存到Session中,以便需要時進行驗證
System.Drawing.Bitmap image = new System.Drawing.Bitmap(70, 22);
Graphics g = Graphics.FromImage(image);
try
{
//生成隨機生成器
Random random = new Random();
//清空圖片背景色
g.Clear(Color.White);
// 畫圖片的背景噪音線
int i;
for (i = 0; i < 25; i++)
{
int x1 = random.Next(image.Width);
int x2 = random.Next(image.Width);
int y1 = random.Next(image.Height);
int y2 = random.Next(image.Height);
g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
}
Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold));
System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2F, true);
g.DrawString(checkCode, font, brush, 2, 2);
//畫圖片的前景噪音點
g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
context.Response.ClearContent();
context.Response.ContentType = "image/Gif";
context.Response.BinaryWrite(ms.ToArray());
}
finally
{
g.Dispose();
image.Dispose();
}
}
/// <summary>
/// 產生隨機字符串
/// </summary>
/// <param name="num">隨機出幾個字符</param>
/// <returns>隨機出的字符串</returns>
private string GenCode(int num)
{
string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//"的一是在不了有和人這中大爲上個國我以要他時來用們生到作地於出就分對成會可主發年動同工也能下過子說產種面而方後多定行學法所民得經十三之進着等部度家電力裏如水化高自二理起小物現實加量都兩體制機當使點從業本去把性好應開它合還因由其些然前外天政四日那社義事平形相全表間樣與關各重新線內數正心反你明看原又麼利比或但質氣第向道命此變條只沒結解問意建月公無系軍很情者最立代想已通並提直題黨程展五果料象員革位入常文總次品式活設及管特件長求老頭基資邊流路級少圖山統接知較將組見計別她手角期根論運農指幾九區強放決西被幹做必戰先回則任取據處隊南給色光門即保治北造百規熱領七海口東導器壓志世金增爭濟階油思術極交受聯什認六共權收證改清己美再採轉更單風切打白教速花帶安場身車例真務具萬每目至達走積示議聲報鬥完類八離華名確才科張信馬節話米整空元況今集溫傳土許步羣廣石記需段研界拉林律叫且究觀越織裝影算低持音衆書布覆容兒須際商非驗連斷深難近礦千周委素技備半辦青省列習響約支般史感勞便團往酸歷市克何除消構府稱太準精值號率族維劃選標寫存候毛親快效斯院查江型眼王按格養易置派層片始卻專狀育廠京識適屬圓包火住調滿縣局照參紅細引聽該鐵價嚴";
char[] chastr = str.ToCharArray();
// string[] source ={ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "#", "$", "%", "&", "@" };
string code = "";
Random rd = new Random();
int i;
for (i = 0; i < num; i++)
{
//code += source[rd.Next(0, source.Length)];
code += str.Substring(rd.Next(0, str.Length), 1);
}
return code;
}
public bool IsReusable
{
get
{
return false;
}
}
}
前臺NewsComment代碼:
<p>
驗證碼:<a name="com"> </a><img src="handler/a.ashx" id="vimg" alt="" οnclick="changeCode()"/>
前臺NewComment添加javascript:
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
<script lang="ja" type="text/javascript">
function changeCode() {
var imgNode = document.getElementById("vimg");
imgNode.src = "handler/WaterMark.ashx?t=" + (new Date()).valueOf(); // 這裏加個時間的參數是爲了防止瀏覽器緩存的問題
}
</script>
</asp:Content>
其次出現的錯誤:
按照以上的方法在常理上就應該能夠出現我們想要的效果,但是最終的效果如圖片:
這樣預想不到的效果,讓我感覺挺震撼的。明明代碼都是一樣的呀,爲什麼會這樣呢?自己調試了很久之後,就去找文哲兄,在哪裏看着他調代碼,雖然他在調代碼,但是他讓我學到了他解決問題的方法,在網頁上調試代碼的方法,最後的時候他還告訴了我的一個技巧,每一個網頁都可以捕捉每一個動作,這樣就可以很清楚的瞭解當前程序運行的狀態了。和別人交流,看別人調代碼也是一種學習。
最後解決方案:
回過頭來說我的問題,今天下午在調試的時候,以及我剛剛寫博客的同時又在做實驗所得出的結果:
1.我的生成驗證碼的函數毫不猶豫的寫在了後臺即WaterMark.ashx.cs
剛剛上網查找的資料就是:我們在這裏引用了javascript,javascript是一種解釋性的腳本語言,代碼不進行預編譯。而我們的ashx.cs是後臺的編譯代碼在啓動的時候,如果卸載ashx.cs中就要進行預編譯,所以這種做法是不行的。但是問題點在,牛腩新建的時候是自己設計的模板,但是在創建一般處理程序的時候只有.ashx文件,但是沒有ashx.cs,具體的原因能力有限只能到這裏了。
2.就是自己在測試的時候,測試了一下
<%@ WebHandler Language="C#" CodeBehind="Handler1.ashx.cs" Class="Web.handler.Handler1" %>
這個是在剛創建一般處理程序的時候,.ashx文件中的一行註釋,如果我們註釋這樣寫着,驗證碼的代碼不變,同樣會出現同樣的錯誤
如果將這行註釋改成:
<%@ WebHandler Language="C#" Class="WaterMark" %>
這樣就會出現我們預想的效果。至於爲什麼這樣子,以我現在理解就是前天的newscomment 調用 WaterMark.ashx的時候,也許調用的就是他的那行註釋,這樣就會讓程序找到這個函數,然後進行運行。
以上是根據我查找資料,做一些小實驗的出的結論,至於真正的原因是什麼——盲人摸象,先這麼理解!
雖然問題不斷出現,但是學習的熱情保持在高溫ing!!!!