C50108
  • 2019/0801/轉職成功路途開始
  • 自學心得與此網站使用方式
  • 行事曆&課程大綱
  • 2019/0224/自我檢視
  • 雜記
    • 2019/0103/雜記
    • 2019/0410/作品集建構
    • 2019/0429/職訓局書單
    • 2019/0317/自我檢視
    • 2019/0316/陪玄松去高車討論&環境圖流程圖大神們line討論
    • 2019/0305/Gitbook使用方法
  • 2018/10XX/轉職心路歷程
  • 職訓局里程碑
    • 201901
      • 2019/0103/行動商務系統設計與開發,職訓局報到
      • 2019/0104/正式開課日&行動商務課程簡介
      • 2019/0108/資料庫理論/Access&WEB開發簡介
      • 2019/0109/資料庫資料型態屬性&HTMLtag
      • 2019/0110/計概基礎概念
      • 2019/0111/HTML表格table&form表單_post/get&iframe
      • 2019/0114/計&網概概念&網路層概念
      • 2019/0115/資料庫Access運算值&CSS簡介&在職班補充
      • 2019/0116/Access比較/邏輯運算&CSS_在職班補充+選擇器+Box model
      • 2019/0117/資訊系統架構&網路層
      • 2019/0118/資料庫正規化
      • 2019/0121/計概IT分工&資料庫正規化
      • 2019/0122/網路層&CSS父子容器切版
      • 2019/0123/Access資料庫關聯&CSS position&偵錯
      • 2019/0124/C#宣告、指定運算子
      • 2019/0125/VM虛擬機_基礎介紹
      • 2019/0128/VM虛擬機架設_虛擬網卡設定&伺服器權限設置
      • 2019/0129/Wireshark查詢網路層&資料庫物件導向
      • 2019/0130/ERmod雞爪圖&C#if、for時間複雜度
      • 2019/0131/C#流程控制&變數型別
    • 201902
      • 2019/0201/系統分析與設計_資料庫ERmod&c#Homework
      • 2019/0211/ASP.NET_Webforms&物件命名空間
      • 2019/0212/定址&網路遮罩
      • 2019/0213/SQLSeverM.S.介紹&AspWebforms表單控制項
      • 2019/0214/網概乙太網路&網路安全
      • 2019/0215/Pre Javascript 基礎 & 在職班補充
      • 2019/0218/TSQL基本指令&ASP.net左右置換表格/驗證傳值
      • 2019/0219/Javascript終極密碼&musicplay&asp.net驗證器
      • 2019/0220/SS基本語法&網概line機器人
      • 2019/0221/前端Javascript musicplay、內聚力耦合率
      • 2019/0222/前端Javascript musicplay、內聚力耦合率&伺服器權限
      • 2019/0223/SqlServerHomework&第一次專案報告
      • 2019/0225/SS合併查詢&ASP.NET驗證器
      • 2019/0226/伺服器ntfs安全性權限/共用權限
      • 2019/0227/Javascript_music_play_end&ASP.net串聯SQL(datasource就是拿來串SQLServer的)
    • 201903
      • 2019/0304/SS集合運算/子查詢/exists&asp.net GridView 事件 OnRowDataBound
      • 2019/0305/SS查詢式end&ASP.NET_Gridview_自訂樣式分頁
      • 2019/0306/Javascript musicplay_really_end
      • 2019/0307/前端HTML5鑲嵌字型&伺服器網域概念
      • 2019/0308/Android Studio_基礎概念&開發環境建置
      • 2019/0311/胡中興 工業4.0講習
      • 2019/0312/安卓系統_開發基礎介紹
      • 2019/0313/安卓工作室_基礎/布局內元件
      • 2019/0314/Asp.net鏈結資料庫-查詢
      • 2019/0315/SQS DML&第二次專案報告
      • 2019/0318/SQL DDL & 伺服器 自學基礎
      • 2019/0319/Android Studio_布局內元件&佈局規劃元件
      • 2019/0320/SQL檢視表&tsql基礎&Asp.net_Gridview
      • 2019/0321/TSQL&TDM&ASP.NET_Datalist
      • 2019/0322/DOM&JQ基礎&系統分析設計PPT&在職班補充
      • 2019/0325/TMD&Asp.net上傳圖片/產生QRCode
      • 2019/0326/SQLServer_預存程序+函數&Asp.net_Webforms半自動鏈結資料庫與自動化更新
      • 2019/0327/安卓工作室_佈局規劃元件
      • 2019/0328/jQuery選擇器應用&Ajax導讀+應用&asp.net串sserver_註冊帳號功能
      • 2019/0329/ADDS伺服器架設&第三次專題報告
    • 201904
      • 2019/0401/SQL觸發程序&Asp.net自動寄信&認證信
      • 2019/0402/前端作業四-jQ應用轉換樣式&ASP.NET_FormView控制項-會員資料維護實例
      • 2019/0403/JQ事件動畫&股市&Usecase
      • 2019/0408/安卓工作室_元件/布局基本end
      • 2019/0409/安卓工作室-物件導向事件驅動實作+Homework1&2
      • 2019/0410/上午小組討論-作品集自習&Visual studio webform+MVC範本
      • 2019/0411/安卓工作室-UI觸發委派函式與控制物件
      • 2019/0412/JQ動畫實做(寶可夢遊戲開場)&第四次專題報告
      • 2019/0415/前端JQ-Ajax+JSON&後端ADO建置、主板頁面概念控制項、Bootstrap演示
      • 2019/0416/安卓工作室UI控件案例結束、IDE Eclipse_Java物件導向基礎
      • 2019/0417/伺服器網域ADDNS&416LINE討論
      • 2019/0418/SQL指標、索引&Use cace
      • 2019/0419/主頁、Webform ADO.NET Entity Fromwork 增刪修實作&第五次專題報告
      • 2019/0423/Java基礎(型別/溢位/自動強制型別轉換/鑄造物件/串流/)&I/O物件用法(底層/較不底層)
      • 2019/0424/Bootstrap_RWD基礎/應用&Asp.Net_MVC實作增刪修(修待補)
      • 2019/0425/伺服器IIS安裝&資料匯入與管理
      • 2019/0426/Asp.Net_MVC增刪修實作(補修)&bootstrap – gridsystem– 網格系統&第六次專題報告&全國技能競賽網頁設計
      • 2019/0429/物件導向技術原理方法實作
      • 2019/0430/資料庫設計應用效能調教_SQL all end&ASP.NET_MVC_Controller單元_純C無V無M操作/簡單複雜繫結
    • 201905
      • 2019/0501/內部網站辨識&外部DNS域名/IP+自架DNS伺服器理解
      • 2019/0502/Java語言基礎、物件導向基礎
      • 2019/0503/Asp.net泛型處理常式驗證圖片應用&第七次專題報告Usecase
      • 2017/0506/Bs_FlexBox&Asp.Net_MVC_View+Razor@+Viewbag+helper
      • 2019/0507/Java 物件導向_類別+函式觀念&階段性作業三
      • 2019/0508/Asp.Net_MVC_Model_ADO.NET+Entityframework+LoginMember實作+MVC觀念
      • 2019/0509/Java物件導向(函式)_儲存型態+回傳值+多載+自制+例外處理+this參照+存取+複合
      • 20919/0510/第八次專題報告=功能DEMO
      • 2019/0514/Java_靜態類別+繼承特性
      • 2019/0515/RWD Utility+Card&MVC ViewModel+CRUD(RD)
      • 2019/0516/BS form&驗證+JQ驗證 & MVC_CRUD(CU)
      • 2019/0517/ASP.NET Webform介紹Master page 主頁 & Session 簡介 & 登入login驗證 & 隱碼攻擊injection & 工具箱程式碼片段使用
      • 2019/0520/繼承&存取權特性+java作業四+字符串格式化+多形+抽象類別
      • 2019/0521/抽象類別+介面
      • 2019/0522/Bootstrap Components 元件介紹 + MVC API 概念&實作
      • 2019/0523/IIS IP限制&ASP.NET部屬
      • 2019/0524/WebApi異質程式連線方式&第九次專題報告_循序圖
      • 2019/0528/Bootstrap Components 元件介紹 + MVC 登入驗證 + 商品加入購物車 實作
      • 2019/0529/ASP.NET_MVC購物車訂單功能完成+BootstrapComponents元件介紹
      • 2019/0530/原本是伺服器的課,但拿來做專題。
      • 2019/0531/ASP.NET_WebformAllView物件功能清單&ListView實作&第十次專案報告(完整循序圖)
    • 201906
      • 2019/0603/Bootstrap Components RWD End + ASP.NET_MVC Part2 PhotoSharing CodeFirst & Model 驗證
      • 2019/0604/ASP.NET_MVC Part2 PhotoSharing Controller & Filter & ADO.NET & View@RAZOR Helper
      • 2019/0605/Java介面實作&結束+安卓工作室(整合Layout與Java)Intent意圖&Bundle包裹
      • 2019/0606/第十一次專案報告功能demo+SingnaIR+伺服器作業+端午歌唱比賽
      • 2019/0609/黃大神傳授Visual_Studio&除錯技巧
      • 2019/0610/番外篇 Web Socket 即時連線& 就業前準備與技巧
      • 2019/0611/安卓工作室_(意圖+隱含意圖)資料傳遞+Android生命週期+硬體裝置與應用
      • 2019/0612/WebSockets Notification + MVC Part2 PhotoSharing PartialView & ADO.NET & EntitySQL & VMd
      • 2019/0613/MVC Part2 PhotoSharing ViewModel & ErrorHandle
      • 2019/0614/第十二次專案報告 功能Demo
      • 2019/0618/MVC Part2 PhotoSharing Route & Sitemap & _LayOut & AJAX
      • 2019/0618/RWD在職班_(Javascript_object-oriented programming)
      • 2019/0619/安卓工作室_(硬體裝置與應用)相機操作&GPS+階段性作業6+延伸 ( APP End )
      • 2019/0620/MVC補充C#MS SQL匯入CSV+上傳CSV存入MS SQL
      • 2019/0621/第十三次專案報告 功能Demo
    • 2019/0701/最終專案報告
    • 2019/0702/結訓與家人遊台東預計0708開始找工作自學筆記應該會等工作穩定後繼續開始
  • 自學里程碑
    • 201901
      • 2019/0107/DR
      • 2019/0108/UW
      • 2019/0103/Git
      • 2019/0103/CS
      • 2019/0115/Vscode
      • 2019/0116/JSON&AJAX
      • 2019/0122/卡內基
      • 2019/0126/MBTI
      • 2019/0131/PDP 外在 內在
    • 201902
      • 2019/0217/huli_half Developer
      • 2019/0219/SEO
      • 2019/0219/雪球速讀法
    • 201903
      • 2019/0304/asp、php、jsp、asp.net、net. Framework、asp.net core
      • 2019/0329/網站架站初嘗試
    • 201904
      • 2019/0415/Datatype-Explanation
      • 2019/0416/ASP.NET_Webform&Core&MVC(MVVM/MVP)
    • 201905
      • 2019/0613/開發職訓局共同專案時遇到的問題與解法
      • 2019/0514/ASP.NET SignalR
      • 2019/0514/JS擴展-JQ、React、Vue、Angular...
      • 2019/0514/Sass&Scss
      • 2019/0514/MVC結合Webform
      • 2019/0515/ASP.NET MVC_TempData/ViewData/ViewBag
      • 2019/0522/[自學筆記]海綿體啟蒙??
Powered by GitBook
On this page
  • 選擇器概念重談
  • 1.階層樹狀父子繼承概念
  • DOM數概念
  • 選擇器進階用法
  • 既有結點上 DOM操作
  • 前端效果套用在後端物件上
  • 點擊切換頁面主題功能
  • Ajax 應用
  • 題外話: 前端程式如果要用後端的話是不是要寫在後端?
  • Ajax導讀
  • 33member_registeration
  • 首先確認SServer Mysystem 資料庫 dbo.members表單 啥要增加啥要減少
  • 剛剛把前端學歷給刪了所以現在要補上學歷選擇
  • 要將資料存入資料庫
  • 資料寫入資料庫
  • 細節修正
  • 照片資料驗證器
  • 儲存資料後導入17頁17GridView_datasource.aspx
  • 增加功能帳號檢測按鈕
  • 問題:postback清空

Was this helpful?

  1. 職訓局里程碑
  2. 201903

2019/0328/jQuery選擇器應用&Ajax導讀+應用&asp.net串sserver_註冊帳號功能

Previous2019/0327/安卓工作室_佈局規劃元件Next2019/0329/ADDS伺服器架設&第三次專題報告

Last updated 5 years ago

Was this helpful?

y為javascript的函式庫只是有名

JQ 其實就是 選擇器+方法

選擇器概念重談

1.階層樹狀父子繼承概念

DIV會繼承 SPAN不繼承

精緻度高的會吃掉精緻度低

越子輩會蓋過父輩

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <style>
        div{
            color:red;
        }
        div p{
            color: green;
        }
            div>p {
                color: blue;
            }

            div + p {
                color:yellow;
            }
    </style>
</head>
<body>

    <div>
        <p>JavaScript</p>
    </div>

    <span>
        jQuery
    </span>
    <span>
        <p>HTML</p>
    </span>
    <p>
        yyyyyy
    </p>
    <div>
        <p>CSS3</p>
        <b><p>ASP.net</p></b>
        <span>PHP</span>
        <span>
            <p>SQL Server</p>
        </span>
    </div>
    <p>
        yyyyy
    </p>
</body>
</html>

DOM數概念

有時只有清單有id內容是動態的不會有id必須知道是那一階層的第幾個

題外話:現在為何函式庫會放在body底層?

有時函式庫等等的寫在head會造成有些網路不好的使用者已為當掉了其實在載入,放在底層至少會先顯示文本。

題外話:函式庫為何要放在<script>下面?

因為函式庫載了才能用函式阿...

選擇器進階用法

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <style>
        .line{
            border:1px solid;
        }
    </style>
</head>
<body>
    <ol id="list">
        <li>JavaScript程式設計</li>
        <li>jQuery程式設計</li>
        <li>ASP.net程式設計</li>
        <li>PHP程式設計</li>
        <li>JSP程式設計</li>
        <li>ASP3.0程式設計</li>
        <li>Dreamweaver網頁設計</li>
        <li><a href="tw.yahoo.com">Yahoo!奇摩</a></li>
        <li><a href="http://www.google.com.tw">Google</a></li>
        <li><a href="http://kpptr.wda.gov.tw">高屏澎東分署</a></li>
    </ol>

    <script src="Scripts/jquery-3.3.1.min.js"></script>
    <script>
        //$('#list li').addClass('line');
        //$('#list li:contains("SP")').addClass('line');
        //$('#list li>a[href*="o"]').addClass('line');
        $('#list li>a[href$="tw"]').addClass('line');
        //$('#list li>a[href^="tw"]').addClass('line');
    </script>
</body>
</html>

所有的li

文本內容有sp的

題外話: vb tsql 沒有分大小寫 其他程式語言大小寫都是有差別的

li底下a屬性href的值 * 整串裡面包含o的

li底下a屬性href的值 ^ 開頭裡面包含o的

li底下a屬性href的值 $ 結尾裡面包含o的

既有結點上 DOM操作

JQ 的 text( ) 等於 JS 的 innerText

動數的頁節點都是固定的必須打在正確的節點 不然瀏覽器不會幫你翻譯

   <script src="Scripts/jquery-3.3.1.min.js"></script>
    <script>
        $('#container').text('<h2>1111111111</h2>');
        $('#container').html('<h2>1111111111</h2>');
    </script>

JQ 的 html( ) 等於 JS 的 innerHTML

apend ( ) 只在這個物件附加上去 ( 一定在集合的最後一個

after ( ) 只在這個物件之後

$('#container+h1')同輩的所有的h1

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
  
</head>
<body>
    <h1>
        444444
    </h1>
    <div id="container">


    </div>
    <h1>
        333333333
    </h1>

    <script src="Scripts/jquery-3.3.1.min.js"></script>
    <script>
        //$('#container').text('<h2>1111111111</h2>');
        //$('#container').html('<h2>1111111111</h2>');

        $('#container').text('<h2>1111111111</h2>').html('<h2>1111111111</h2>').append('<h2>8888888</h2>');

        $('#container').after('<h2>77777777</h2>')

        $('#container+h1').after('<h2>5555555555555</h2>')

    </script>

</body>
</html>

前端效果套用在後端物件上

28為後端因為要鏈結資料庫

終究編譯完為html 只是不乾淨的

1.為何每次都要在form底下第一個div做事?

原因為要把div當作webform頁面的根取代body

2.可以直接操控後端id

3.其實後端下的style前端也會編譯成相對應css

所以可以根據html樹根概念去調整控制項物件style

讀取順位: 標籤上style tag > link stylesheet > html 內 style tag

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="28GridView.aspx.cs" Inherits="MyWeb._28GridView" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <style>
        #GridView1{
            width:90%;
            margin:auto;
            border:0;
        }
        
        #GridView1 td, #GridView1 th{
            border:0;
        }

        #GridView1 th{
            border-bottom:5px double black;
            background-color:#808080;
            color:white;
        }
        #GridView1 td{
            height:30px;
        }
        #GridView1 tr:hover{
            background-color:beige;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div id="containter">
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MySystemConnectionString %>" SelectCommand="SELECT * FROM [Members]"></asp:SqlDataSource>
            <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1"></asp:GridView>
        </div>
    </form>


    <script src="Scripts/jquery-3.3.1.min.js"></script>
    <script>

    </script>
</body>
</html>

點擊切換頁面主題功能

問題:為什麼切換到後面會沒辦法切前面?

原因是必須清除原來class內容不然只會顯示head style最下面的style

也有可能是扛拜問題f5 ?

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="28GridView.aspx.cs" Inherits="MyWeb._28GridView" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <style>
        #GridView1{
            width:90%;
            margin:auto;
            border:0;
        }
        
        #GridView1 td, #GridView1 th{
            border:0;
        }

        #GridView1 th{
            border-bottom:5px double black;
            background-color:#808080;
            color:white;
        }
        #GridView1 td{
            height:30px;
        }
        #GridView1 tr:hover{
            background-color:beige;
        }


        #btn span{
            border:1px solid;
            cursor:pointer;
        }

        #pink{
            background-color:pink;
        }
        #yellow{
            background-color:lemonchiffon;
        }
        #blue{
            background-color:lightblue;
        }
         #orange{
            background-color:#ffc26c;
        }
        #green{
            background-color:#c0ff89;
        }

        .pink{
            background-color:pink;
        }
        .yellow{
            background-color:lemonchiffon;
        }
        .blue{
            background-color:lightblue;
        }
         .orange{
            background-color:#ffc26c;
        }
        .green{
            background-color:#c0ff89;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div id="btn">
                <span id="pink"> </span>
                <span id="yellow"> </span>
                <span id="blue"> </span>
                <span id="orange"> </span>
                <span id="green"> </span>
        </div>
         <br />
        <div id="containter">
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MySystemConnectionString %>" SelectCommand="SELECT * FROM [Members]"></asp:SqlDataSource>
            <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1"></asp:GridView>
        </div>
    </form>


    <script src="Scripts/jquery-3.3.1.min.js"></script>
    <script>
        //$('#pink').click(function () {
        //    //$('#GridView1 tr:nth-child(2n+1)').css({'background-color':'pink'});
        //    $('#GridView1 tr:nth-child(2n+1)').removeClass().addClass('pink');
        //});
        //$('#yellow').click(function () {
            
        //    $('#GridView1 tr:nth-child(2n+1)').removeClass().addClass('yellow');
        //});
        //$('#blue').click(function () {
          
        //    $('#GridView1 tr:nth-child(2n+1)').removeClass().addClass('blue');
        //});
        //////////////////////////////////

        $('#btn span').click(function (evt) {
            var id=evt.target.id
            $('#GridView1 tr:nth-child(2n+1)').removeClass().addClass(id);
        });
    </script>
</body>
</html>

利用屬性內的值去做顏色切換 ( 這裡是用span的id

題外話 : 後端 void 為沒有回傳值 一定會有個事件傳進去 e 就是這個事件的名字

抓到id值就先去除class裡面東西 然後 將id值的style 置入

Ajax 應用

網址google的api 要錢的 沒有只能試用

世界上的書都給你查詢

撈出來的資料為 jason

以前都是SOAP=>XML 現在都是Restful=>Json跟XML 好像都可以 ? jason資料相對於 xml好讀

沒付費只能接到十筆

題外話: 前端程式如果要用後端的話是不是要寫在後端?

後端可以直接寫前端,後端能直接透過API鏈結資料庫

還是寫後端程式 但是後端沒有UI 所以直接 把UI 變成 API 就可以不用管前端是連在哪 那沒UI那怎辦呢 ? 前端只要知道 api的url在哪裡 直接寫在前端 APP or .... 做顯示

Ajax導讀

學前端如果不會ajax=不會前端

1.呼叫ajax方法

2.確定溝通方式type

3.確定位址url

4.透過這個api向位址內的伺服器做溝通 成功了做 success ( ajax 不會postback所以要觸法某些事情讓我們知道成功或失敗 )

5.顯示回傳的資料 但是幾筆資料不知道所以用迴圈跑

6.不知道要跑幾圈 利用回傳回來的物件(這邊是data自己取的) data.items.length 就是有幾筆

7.每次回圈要做啥事呢?1.把每次回圈的資料丟在item裡面2.將item裡面東西分門別類擺好

8.就算內容是api也直接分類進去因為你直接在url輸入api其實也會顯示內容( 此處為一張圖

9.失敗的話 error 顯示錯誤

10.要分清楚button function 還是 ajax function

題外話 : 圖也是api 他不讓你知道他的圖的位置

第三方 Third party - open data

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <style>
        #booklist {
            width: 1000px;
            border: double 2px;
            margin: auto;
        }

            #booklist tr {
                border-bottom: solid 2px;
            }

            #booklist > tbody tr:nth-child(2n+1) {
                background-color: #c6c6c6;
            }

            #booklist > tbody tr:hover {
                background-color: black;
                color: white;
            }
    </style>
</head>
<body>
    書名:<input id="Text1" type="text" /><input id="Button1" type="button" value="搜尋" />
    <table id="booklist">

    </table>

    <script src="Scripts/jquery-3.3.1.min.js"></script>
    <script>
        $('#Button1').click(function () {
            var bkurl = "https://www.googleapis.com/books/v1/volumes?q=" + $('#Text1').val();

            $.ajax({
                type: 'GET',
                url: bkurl,
                success: function (data) {
                    $('#booklist').append('<thead><th>圖示</th><th>書名</th><th>作者</th><th>出版商</th></thead>');
                    $('#booklist').append('<tbody>');
                    for (var i = 0; i < data.items.length; i++)
                    {
                        var item = data.items[i];
                        var tr = "<tr>";
                        tr += "<td><img src='" + item.volumeInfo.imageLinks.smallThumbnail + "' /></td>";
                        tr += "<td>" + item.volumeInfo.title + "</td>";
                        tr += "<td>" + item.volumeInfo.authors + "</td>";
                        tr += "<td>" + item.volumeInfo.publisher + "</td>";
                        tr += "</tr>";
                        $('#booklist').append(tr);
                    }

                    $('#booklist').append('</tbody>');

                },
                error: function () {
                    alert('Error!!');
                }

            });


        });

    </script>

</body>
</html>

接續上一次後端課程

datalist 無法分頁 gridview 無法新增

每個物件都有當初編譯它的作者制定的一個侷限值

就像 牛仔褲 可以改短 但改短了不能改長 七龍珠許願了就消失 之類的

接下來要講的是

33member_registeration

15webform_validation 註冊驗證器 改寫增加 會員註冊功能 33member_registeration

實做圖檔案不是檔名存進資料庫

Mysystem 資料庫 dbo.members表單 增加判斷帳號是否重複

首先確認SServer Mysystem 資料庫 dbo.members表單 啥要增加啥要減少

如果不讓你儲存 ( 更動既有資料

工具 -> 選項 -> 設計師 -> 取消 -> 防止儲存需要資料表重建的變更

增加照片檔案存檔欄位 ok後

回到 asp.net

修改 15webform_validation 減少一些以往 自動控制項的欄位 與一些驗證器控制項

前端增加照片上傳控制項

前端改完

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="33Member_Registeration.aspx.cs" Inherits="ASPnet._33Member_Registeration" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <style>
            #tbMember {
                width: 450px;
                height: 500px;
                margin: auto;
                border:3px double;
            }

            #tbMember table {
                width: 100%;
            }

            #tbMember>tbody>tr>td:first-child {
                text-align: right;
            }

            #tbMember>tbody>tr:last-child > td {
                text-align: center;
            }
            #tbMember table>tbody>tr>td {
                text-align: center;
            }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div>
          

            <table id="tbMember">
                <caption>註冊會員</caption>
                <tr>
                    <td>帳號:</td>
                    <td>
                        <asp:TextBox ID="txtAccount" runat="server" placeholder="5-10碼"></asp:TextBox>
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" ControlToValidate="txtAccount" Display="Dynamic" runat="server" ErrorMessage="姓名為必填欄位" Text="(必填)" ForeColor="Red" Font-Size="10pt"></asp:RequiredFieldValidator>
                        <asp:RegularExpressionValidator ID="RegularExpressionValidator1" ControlToValidate="txtAccount" ValidationExpression="[A-Za-z][A-Za-z0-9]{4,9}" runat="server" ErrorMessage="(格式有誤)" ForeColor="Red" Font-Size="10pt"></asp:RegularExpressionValidator>
                    </td>
                </tr>
                <tr>
                    <td>密碼:</td>
                    <td>
                        <asp:TextBox ID="txtPwd" runat="server" TextMode="Password" placeholder="8-12碼" MaxLength="12"></asp:TextBox>
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator2" Display="Dynamic" ControlToValidate="txtPwd" runat="server" ErrorMessage="密碼為必填欄位" Text="(必填)" ForeColor="Red" Font-Size="10pt"></asp:RequiredFieldValidator>
                         <asp:RegularExpressionValidator ID="RegularExpressionValidator3" ControlToValidate="txtPwd" ValidationExpression="\S{8,12}" runat="server" ErrorMessage="(密碼不可含有空白)" ForeColor="Red" Font-Size="10pt"></asp:RegularExpressionValidator>
                     </td>
                </tr>
                <tr>
                    <td>密碼確認:</td>
                    <td>
                        <asp:TextBox ID="txtPwd2" runat="server" TextMode="Password" placeholder="請再輸入一次密碼"></asp:TextBox>
                      <%--   <asp:RequiredFieldValidator ID="RequiredFieldValidator6" ControlToValidate="txtPwd2" runat="server" ErrorMessage="(必填)" ForeColor="Red" Font-Size="10pt"></asp:RequiredFieldValidator>--%>
                          <asp:CompareValidator ID="CompareValidator3" runat="server" Operator="Equal" ControlToCompare="txtPwd2"  ControlToValidate="txtPwd" ErrorMessage="(兩次密碼輸入不相同)" ForeColor="Red" Font-Size="10pt"></asp:CompareValidator>
                    </td>
                </tr>
             
                <tr>
                    <td>姓名:</td>
                    <td>
                         <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator4" ControlToValidate="txtName" runat="server" ErrorMessage="(必填)" ForeColor="Red" Font-Size="10pt"></asp:RequiredFieldValidator>
                    </td>
                </tr>
                 <tr>
                    <td>生日:</td>
                    <td>
                         <asp:TextBox ID="txtBirthday" runat="server" placeholder="1990-01-12"></asp:TextBox>
                         <asp:RequiredFieldValidator ID="RequiredFieldValidator5" ControlToValidate="txtBirthday" Display="Dynamic" runat="server" ErrorMessage="(必填)" ForeColor="Red" Font-Size="10pt"></asp:RequiredFieldValidator>
                         <asp:CompareValidator ID="CompareValidator1" Display="Dynamic" runat="server" Operator="DataTypeCheck" Type="Date" ControlToValidate="txtBirthday" ErrorMessage="(格式錯誤)" ForeColor="Red" Font-Size="10pt"></asp:CompareValidator>
                       
                    </td>
                </tr>
                <tr>
                    <td>E-mail:</td>
                    <td>
                         <asp:TextBox ID="txtEmail" runat="server" placeholder="abc@abc.com"></asp:TextBox>
                        <asp:RegularExpressionValidator ID="RegularExpressionValidator4" ControlToValidate="txtEmail" ValidationExpression="([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)" runat="server" ErrorMessage="(格式有誤)" ForeColor="Red" Font-Size="10pt"></asp:RegularExpressionValidator>
                    </td>
                </tr>
                <tr>
                    <td>性別:</td>
                    <td>
                        <asp:RadioButtonList ID="rblGender" runat="server" RepeatDirection="Horizontal" Width="120">
                            <asp:ListItem Text="男" Value="1" Selected="True"></asp:ListItem>
                            <asp:ListItem Text="女" Value="0"></asp:ListItem>
                        </asp:RadioButtonList>
                    </td>
                </tr>
                <tr>
                    <td>學歷:</td>
                    <td>
                        <asp:DropDownList ID="ddlEduLevel" runat="server">
                        <asp:ListItem Text="請選擇"></asp:ListItem>
                        </asp:DropDownList>
                         <asp:CompareValidator ID="CompareValidator2" runat="server" Operator="NotEqual" ValueToCompare="請選擇"  ControlToValidate="ddlEduLevel" ErrorMessage="(請選擇)" ForeColor="Red" Font-Size="10pt"></asp:CompareValidator>
                    </td>
                  
                </tr>
                 <tr>
                    <td>照片:</td>
                    <td>
                        <asp:FileUpload ID="fulPhoto" runat="server" />
                    </td>
                  
                </tr>
               <tr>
                    <td>備註:</td>
                    <td>
                        <asp:TextBox ID="txtNote" TextMode="MultiLine" runat="server" Width="200" Height="150"></asp:TextBox>
                       </td>
                  
                </tr>
                 <tr>
                    <td colspan="2">
                        <asp:Button ID="Button1" runat="server" Text="加入會員" OnClick="Button1_Click"  />
                        <input id="Reset1" type="reset" value="重設" />
                    </td>                  
                </tr>
                
            </table>
        </div>
    </form>
</body>
</html>

題外話:

程式進入點 程式寫了很多功能 一開始總是要執行阿 所以會有個 main

網頁的生命週期跟一般程式的週期不太一樣

page_load 只是相對的起始點 其實前面還有很多

pre init > page init > page load > pre roader ...

換後端

剛剛把前端學歷給刪了所以現在要補上學歷選擇

sqlconnection 建構資料庫物件 抓資料庫資料放進去 啟動configuration管理員 抓哪一個 抓啥資料 sqlcommand 要對sqlserver下啥指令

sqldatareader 要閱覽啥資料

conn.open 下指令 資料庫開啟

執行資料閱覽 rd = Cmd.ExecuteReader()

在前端寫死一個 listitem 請選擇 後端判斷 要不是請選擇才是必填

後端建構一個 listitem 物件

利用迴圈將每一次閱覽控制器去讀取學歷有哪些

並加入倒 listitem 的物件中

資料庫關閉

   protected void Page_Load(object sender, EventArgs e)
        {
            //SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySystemConnectionString1"].ConnectionString);
            SqlCommand Cmd = new SqlCommand("select * from Edu order by EduLevel_Code desc",Conn);

            SqlDataReader rd;
            Conn.Open();
            rd = Cmd.ExecuteReader();
            ListItem item;
            while(rd.Read())
            {
                item = new ListItem(rd["EduLevel"].ToString(),rd["EduLevel_Code"].ToString());
                ddlEduLevel.Items.Add(item);
            }

            Conn.Close();
        }

要將資料存入資料庫

SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySystemConnectionString1"].ConnectionString);

區域變數 所以必須要再寫一次 鏈結資料庫 所以學聰明 寫在最外層

資訊安全風險 sql injection 資料隱碼攻擊 製作登入系統時實做給大家看 ( 不用帳號密碼

只要把 sql 跟程式變數串一起寫就會有 si 所以要換成 參數 改成純量變數

為什麼串在一起寫會有問題? 因為 駭客 可以在 note 輸入框直接輸入命令式

sqlcommand 要對sqlserver下啥指令

要利用 parameters 參數控件 將 參數與資料串起來

除了照片檔案其他資料之前都寫過驗證器了所以要補上

@photo 是要存照片檔案內容 不是檔名 所以資料型態要用 filebytes

資料寫入資料庫

資料庫開啟

執行executenonquery 執行上述的指令 -> sqlcommand 要對sqlserver下啥指令

資料庫關閉

 protected void Button1_Click(object sender, EventArgs e)
        {

            SqlCommand Cmd = new SqlCommand("insert into members values(@account,hashbytes('sha2_256',@pwd),@name,@birthday,@email,@gender,@edu,@note,@photo)", Conn);
            Cmd.Parameters.AddWithValue("@account",txtAccount.Text);
            Cmd.Parameters.AddWithValue("@pwd", txtPwd.Text);
            Cmd.Parameters.AddWithValue("@name", txtName.Text);
            Cmd.Parameters.AddWithValue("@birthday", txtBirthday.Text);
            Cmd.Parameters.AddWithValue("@email", txtEmail.Text);
            Cmd.Parameters.AddWithValue("@gender", rblGender.SelectedValue);
            Cmd.Parameters.AddWithValue("@edu", ddlEduLevel.SelectedValue);
            Cmd.Parameters.AddWithValue("@note", txtNote.Text);
            Cmd.Parameters.AddWithValue("@photo", fulPhoto.FileBytes);

            Conn.Open();
            Cmd.ExecuteNonQuery();
            Conn.Close();
        }

細節修正

1.怕user key錯資料

2.密碼不能是明碼 -> 雜湊即可 ->

雜湊函數 hashbytes ('雜湊成什麼格式',明碼 ) -> hashbytes ('sha2_256',@pwd )

3.為了不讓user看見錯誤訊息或是例外訊息(sserver出錯)

需要下以下

catch (Exception ex) { Response.Write(ex.Message); }

照片資料驗證器

最外層直接驗證上傳資料 (裡面有上傳資料需求的只有照片所以可以key在外層)

在前端放個lable 模仿驗證器出錯實顯示樣態

<asp:Label ID="lblPhoto" Font-Size="10pt" ForeColor="Red" runat="server"></asp:Label>

如果驗證成功則可上傳

else 如果不成功則照片驗證器lable顯示錯誤

後端

 SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySystemConnectionString1"].ConnectionString);

        protected void Page_Load(object sender, EventArgs e)
        {
            //SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySystemConnectionString1"].ConnectionString);
            SqlCommand Cmd = new SqlCommand("select * from Edu order by EduLevel_Code desc",Conn);

            SqlDataReader rd;
            Conn.Open();
            rd = Cmd.ExecuteReader();
            ListItem item;
            while(rd.Read())
            {
                item = new ListItem(rd["EduLevel"].ToString(),rd["EduLevel_Code"].ToString());
                ddlEduLevel.Items.Add(item);
            }

            Conn.Close();
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            if (fulPhoto.PostedFile.ContentType == "image/jpeg")
            {
                try
                {
                    SqlCommand Cmd = new SqlCommand("insert into members values(@account,hashbytes('sha2_256',@pwd),@name,@birthday,@email,@gender,@edu,@note,@photo)", Conn);
                    Cmd.Parameters.AddWithValue("@account", txtAccount.Text);
                    Cmd.Parameters.AddWithValue("@pwd", txtPwd.Text);
                    Cmd.Parameters.AddWithValue("@name", txtName.Text);
                    Cmd.Parameters.AddWithValue("@birthday", txtBirthday.Text);
                    Cmd.Parameters.AddWithValue("@email", txtEmail.Text);
                    Cmd.Parameters.AddWithValue("@gender", rblGender.SelectedValue);
                    Cmd.Parameters.AddWithValue("@edu", ddlEduLevel.SelectedValue);
                    Cmd.Parameters.AddWithValue("@note", txtNote.Text);
                    Cmd.Parameters.AddWithValue("@photo", fulPhoto.FileBytes);

                    Conn.Open();
                    Cmd.ExecuteNonQuery();
                    Conn.Close();
                }
                catch (Exception ex)
                {
Response.Write(ex.Message); 
                }
            }
            else
            {
                lblPhoto.Text = "照片格式錯誤!";
            }
        }

小問題: postback 造成 學歷欄重複增加 item

( 但通常實務上會轉頁面而不是 postback ( 所以可以下指令只有第一次才會執行

( postback 時並不會執行

if (!IsPostBack) {程式} 

如果不是Postback則執行程式

儲存資料後導入17頁17GridView_datasource.aspx

Response.Redirect("17GridView_datasource.aspx")

此時的前端

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="33Member_Registeration.aspx.cs" Inherits="ASPnet._33Member_Registeration" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <style>
            #tbMember {
                width: 450px;
                height: 500px;
                margin: auto;
                border:3px double;
            }

            #tbMember table {
                width: 100%;
            }

            #tbMember>tbody>tr>td:first-child {
                text-align: right;
            }

            #tbMember>tbody>tr:last-child > td {
                text-align: center;
            }
            #tbMember table>tbody>tr>td {
                text-align: center;
            }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div>
          

            <table id="tbMember">
                <caption>註冊會員</caption>
                <tr>
                    <td>帳號:</td>
                    <td>
                        <asp:TextBox ID="txtAccount" runat="server" placeholder="5-10碼"></asp:TextBox>
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" ControlToValidate="txtAccount" Display="Dynamic" runat="server" ErrorMessage="姓名為必填欄位" Text="(必填)" ForeColor="Red" Font-Size="10pt"></asp:RequiredFieldValidator>
                        <asp:RegularExpressionValidator ID="RegularExpressionValidator1" ControlToValidate="txtAccount" ValidationExpression="[A-Za-z][A-Za-z0-9]{4,9}" runat="server" ErrorMessage="(格式有誤)" ForeColor="Red" Font-Size="10pt"></asp:RegularExpressionValidator>
                    </td>
                </tr>
                <tr>
                    <td>密碼:</td>
                    <td>
                        <asp:TextBox ID="txtPwd" runat="server" TextMode="Password" placeholder="8-12碼" MaxLength="12"></asp:TextBox>
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator2" Display="Dynamic" ControlToValidate="txtPwd" runat="server" ErrorMessage="密碼為必填欄位" Text="(必填)" ForeColor="Red" Font-Size="10pt"></asp:RequiredFieldValidator>
                         <asp:RegularExpressionValidator ID="RegularExpressionValidator3" ControlToValidate="txtPwd" ValidationExpression="\S{8,12}" runat="server" ErrorMessage="(密碼不可含有空白)" ForeColor="Red" Font-Size="10pt"></asp:RegularExpressionValidator>
                     </td>
                </tr>
                <tr>
                    <td>密碼確認:</td>
                    <td>
                        <asp:TextBox ID="txtPwd2" runat="server" TextMode="Password" placeholder="請再輸入一次密碼"></asp:TextBox>
                      <%--   <asp:RequiredFieldValidator ID="RequiredFieldValidator6" ControlToValidate="txtPwd2" runat="server" ErrorMessage="(必填)" ForeColor="Red" Font-Size="10pt"></asp:RequiredFieldValidator>--%>
                          <asp:CompareValidator ID="CompareValidator3" runat="server" Operator="Equal" ControlToCompare="txtPwd2"  ControlToValidate="txtPwd" ErrorMessage="(兩次密碼輸入不相同)" ForeColor="Red" Font-Size="10pt"></asp:CompareValidator>
                    </td>
                </tr>
             
                <tr>
                    <td>姓名:</td>
                    <td>
                         <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator4" ControlToValidate="txtName" runat="server" ErrorMessage="(必填)" ForeColor="Red" Font-Size="10pt"></asp:RequiredFieldValidator>
                    </td>
                </tr>
                 <tr>
                    <td>生日:</td>
                    <td>
                         <asp:TextBox ID="txtBirthday" runat="server" placeholder="1990-01-12"></asp:TextBox>
                         <asp:RequiredFieldValidator ID="RequiredFieldValidator5" ControlToValidate="txtBirthday" Display="Dynamic" runat="server" ErrorMessage="(必填)" ForeColor="Red" Font-Size="10pt"></asp:RequiredFieldValidator>
                         <asp:CompareValidator ID="CompareValidator1" Display="Dynamic" runat="server" Operator="DataTypeCheck" Type="Date" ControlToValidate="txtBirthday" ErrorMessage="(格式錯誤)" ForeColor="Red" Font-Size="10pt"></asp:CompareValidator>
                       
                    </td>
                </tr>
                <tr>
                    <td>E-mail:</td>
                    <td>
                         <asp:TextBox ID="txtEmail" runat="server" placeholder="abc@abc.com"></asp:TextBox>
                        <asp:RegularExpressionValidator ID="RegularExpressionValidator4" ControlToValidate="txtEmail" ValidationExpression="([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)" runat="server" ErrorMessage="(格式有誤)" ForeColor="Red" Font-Size="10pt"></asp:RegularExpressionValidator>
                    </td>
                </tr>
                <tr>
                    <td>性別:</td>
                    <td>
                        <asp:RadioButtonList ID="rblGender" runat="server" RepeatDirection="Horizontal" Width="120">
                            <asp:ListItem Text="男" Value="1" Selected="True"></asp:ListItem>
                            <asp:ListItem Text="女" Value="0"></asp:ListItem>
                        </asp:RadioButtonList>
                    </td>
                </tr>
                <tr>
                    <td>學歷:</td>
                    <td>
                        <asp:DropDownList ID="ddlEduLevel" runat="server">
                        <asp:ListItem Text="請選擇"></asp:ListItem>
                        </asp:DropDownList>
                         <asp:CompareValidator ID="CompareValidator2" runat="server" Operator="NotEqual" ValueToCompare="請選擇"  ControlToValidate="ddlEduLevel" ErrorMessage="(請選擇)" ForeColor="Red" Font-Size="10pt"></asp:CompareValidator>
                    </td>
                  
                </tr>
                 <tr>
                    <td>照片:</td>
                    <td>
                        <asp:FileUpload ID="fulPhoto" runat="server" /><asp:Label ID="lblPhoto" Font-Size="10pt" ForeColor="Red" runat="server"></asp:Label>
                    </td>
                  
                </tr>
               <tr>
                    <td>備註:</td>
                    <td>
                        <asp:TextBox ID="txtNote" TextMode="MultiLine" runat="server" Width="200" Height="150"></asp:TextBox>
                       </td>
                  
                </tr>
                 <tr>
                    <td colspan="2">
                        <asp:Button ID="Button1" runat="server" Text="加入會員" OnClick="Button1_Click"  />
                        <input id="Reset1" type="reset" value="重設" />
                    </td>                  
                </tr>
                
            </table>
        </div>
    </form>
</body>
</html>

此時的後端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Data.SqlClient;
using System.Configuration;

namespace ASPnet
{
    public partial class _33Member_Registeration : System.Web.UI.Page
    {
        SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySystemConnectionString1"].ConnectionString);

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySystemConnectionString1"].ConnectionString);
                SqlCommand Cmd = new SqlCommand("select * from Edu order by EduLevel_Code desc", Conn);

                SqlDataReader rd;
                Conn.Open();
                rd = Cmd.ExecuteReader();
                ListItem item;
                while (rd.Read())
                {
                    item = new ListItem(rd["EduLevel"].ToString(), rd["EduLevel_Code"].ToString());
                    ddlEduLevel.Items.Add(item);
                }

                Conn.Close();
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            if (fulPhoto.PostedFile.ContentType == "image/jpeg")
            {
                try
                {
                    SqlCommand Cmd = new SqlCommand("insert into members values(@account,hashbytes('sha2_256',@pwd),@name,@birthday,@email,@gender,@edu,@note,@photo)", Conn);
                    Cmd.Parameters.AddWithValue("@account", txtAccount.Text);
                    Cmd.Parameters.AddWithValue("@pwd", txtPwd.Text);
                    Cmd.Parameters.AddWithValue("@name", txtName.Text);
                    Cmd.Parameters.AddWithValue("@birthday", txtBirthday.Text);
                    Cmd.Parameters.AddWithValue("@email", txtEmail.Text);
                    Cmd.Parameters.AddWithValue("@gender", rblGender.SelectedValue);
                    Cmd.Parameters.AddWithValue("@edu", ddlEduLevel.SelectedValue);
                    Cmd.Parameters.AddWithValue("@note", txtNote.Text);
                    Cmd.Parameters.AddWithValue("@photo", fulPhoto.FileBytes);

                    Conn.Open();
                    Cmd.ExecuteNonQuery();
                    Conn.Close();

                    Response.Redirect("17GridView_DataSource.aspx");
                }
                catch (Exception ex)
                {
			Response.Write(ex.Message); 
                }
            }
            else
            {
                lblPhoto.Text = "照片格式錯誤!";
            }
        }
    }
}

小問題: fulPhoto.FileBytes 沒有抓到東西 為 空 ,

存不會有問題但在讀資料時會出現問題 ,

沒有傳資料時 ContentType 裡面預設為 application / octet - stream 。

沒傳資料時 不要直接抓 FileBytes ,判斷式直接寫在 資料轉參數 這 , 判斷空時 傳空值null進資料庫端。

( 大改版 因為老師一開始沒釐清邏輯所以直接先由存資料至後端開始編寫 到這有點亂了他開始改

後端為以下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Data.SqlClient;
using System.Configuration;

namespace ASPnet
{
    public partial class _33Member_Registeration : System.Web.UI.Page
    {
        SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySystemConnectionString1"].ConnectionString);

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySystemConnectionString1"].ConnectionString);
                SqlCommand Cmd = new SqlCommand("select * from Edu order by EduLevel_Code desc", Conn);

                SqlDataReader rd;
                Conn.Open();
                rd = Cmd.ExecuteReader();
                ListItem item;
                while (rd.Read())
                {
                    item = new ListItem(rd["EduLevel"].ToString(), rd["EduLevel_Code"].ToString());
                    ddlEduLevel.Items.Add(item);
                }

                Conn.Close();
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            //if (fulPhoto.PostedFile.ContentType != "application/octet-stream")
            //{
            //    if (fulPhoto.PostedFile.ContentType == "image/jpeg")
            //    {
                    try
                    {
                        SqlCommand Cmd = new SqlCommand("insert into members values(@account,hashbytes('sha2_256',@pwd),@name,@birthday,@email,@gender,@edu,@note,@photo)", Conn);
                        Cmd.Parameters.AddWithValue("@account", txtAccount.Text);
                        Cmd.Parameters.AddWithValue("@pwd", txtPwd.Text);
                        Cmd.Parameters.AddWithValue("@name", txtName.Text);
                        Cmd.Parameters.AddWithValue("@birthday", txtBirthday.Text);
                        Cmd.Parameters.AddWithValue("@email", txtEmail.Text);
                        Cmd.Parameters.AddWithValue("@gender", rblGender.SelectedValue);
                        Cmd.Parameters.AddWithValue("@edu", ddlEduLevel.SelectedValue);
                        Cmd.Parameters.AddWithValue("@note", txtNote.Text);
                        if(fulPhoto.PostedFile.ContentType == "application/octet-stream")
                             Cmd.Parameters.AddWithValue("@photo", null);
                        else
                             Cmd.Parameters.AddWithValue("@photo", fulPhoto.FileBytes);

                        Conn.Open();
                        if (fulPhoto.PostedFile.ContentType == "image/jpeg")
                            Cmd.ExecuteNonQuery();
                        else
                            lblPhoto.Text = "格式有錯!!";
                         Conn.Close();

                        Response.Redirect("17GridView_DataSource.aspx");
                    }
                    catch (Exception ex)
                    {
Response.Write(ex.Message); 
                    }
            //    }
            //    else
            //    {
            //        lblPhoto.Text = fulPhoto.PostedFile.ContentType;
            //    }
            //}
            
        }
    }
}

小問題: 帳號重複結果跳 pk重複 。 改為放在 try catch 裡面。

將判斷帳號是否重複寫成一個函數,兩種方式,

一種在資料庫端、一種在後端,但後端必須撈資料再判斷,所以乾脆直接寫在 資料庫端。

參數資料類型必須要一樣

create function fnCheckMemberAccount
(@account varchar(10))
returns int
as
begin
declare @aa varchar(10)
--函數不是預存程序,所以不允許直接寫結果,執行完不能是表只能是值
select @aa=account from Members where account=@account
if @@ROWCOUNT=0 
--表示沒找筆數代表資料可用
return 0 
--回傳false
return 1
end

----

select dbo.fnCheckMemberAccount('bow')

回到前端新增驗證器顯示帳號重複

後端不用寫邏輯只需要呼叫sqlserver函數

將參數改為變數傳回前端驗證控制器即可

protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
        {
            SqlCommand Cmd = new SqlCommand("select dbo.fnCheckMemberAccount(@account)", Conn);
            Cmd.Parameters.AddWithValue("@account", txtAccount.Text);

            SqlDataReader rd;
            Conn.Open();
            rd = Cmd.ExecuteReader();

            rd.Read();
            if (rd[0].ToString() == "0")
                args.IsValid = true;
            else
                args.IsValid = false;

            Conn.Close();
        }

小問題: 照片上傳出現postback重複 ( 邏輯不對 用上面教的方式可以解決

增加功能帳號檢測按鈕

( 只會啟動帳號可用性判斷 ( 利用驗證群組名稱控制某個群組內的控制項被觸發

增加 if (this.IsValid)

實際上實務的問題會有很多事情需要一步步考量

問題:postback清空

只要點擊檢查帳號可用性或是之前興趣按鈕 按下去都會postback清空其他輸入框 造成內容消失。

解決辦法 : 局部更新 -> 進階應用 每xx秒重複刷 -> 利用前端ajax -> webfroms 可以直接用控制項寫ajax

ajax能夠在不postback的情況下能夠更新伺服器資料->其實很多故事(微軟)->

在前端使用工具箱AJAX擴充功能->ScriptManager前端函式庫->要局部更新的地方放在updatepanel控制項的contenttemplate屬性裡面->這個區塊就可以自己跟伺服器做reqrit跟respabns

最後前端程式碼

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="33Member_Registeration.aspx.cs" Inherits="ASPnet._33Member_Registeration" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <style>
            #tbMember {
                width: 450px;
                height: 500px;
                margin: auto;
                border:3px double;
            }

            #tbMember table {
                width: 100%;
            }

            #tbMember>tbody>tr>td:first-child {
                text-align: right;
            }

            #tbMember>tbody>tr:last-child > td {
                text-align: center;
            }
            #tbMember table>tbody>tr>td {
                text-align: center;
            }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>

            <table id="tbMember">
                <caption>註冊會員</caption>
                <tr>
                    <td>帳號:</td>
                    <td>
                        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                            <ContentTemplate>
                                <asp:TextBox ID="txtAccount" runat="server" placeholder="5-10碼"></asp:TextBox><asp:Button ID="Button2" runat="server" Text="檢查帳號可用性" ValidationGroup="abc123" />
                                <asp:RequiredFieldValidator ID="RequiredFieldValidator1" ControlToValidate="txtAccount" Display="Dynamic" runat="server" ErrorMessage="姓名為必填欄位" Text="(必填)" ForeColor="Red" Font-Size="10pt"></asp:RequiredFieldValidator>
                                <asp:RegularExpressionValidator ID="RegularExpressionValidator1" ControlToValidate="txtAccount" Display="Dynamic" ValidationExpression="[A-Za-z][A-Za-z0-9]{4,9}" runat="server" ErrorMessage="(格式有誤)" ForeColor="Red" Font-Size="10pt"></asp:RegularExpressionValidator>
                                <asp:CustomValidator ID="CustomValidator1" runat="server" ErrorMessage="(帳號重複)" ForeColor="Red" Font-Size="10pt" ValidationGroup="abc123" OnServerValidate="CustomValidator1_ServerValidate"></asp:CustomValidator>
                            </ContentTemplate>
                        </asp:UpdatePanel>
                    </td>
                </tr>
                <tr>
                    <td>密碼:</td>
                    <td>
                        <asp:TextBox ID="txtPwd" runat="server" TextMode="Password" placeholder="8-12碼" MaxLength="12"></asp:TextBox>
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator2" Display="Dynamic" ControlToValidate="txtPwd" runat="server" ErrorMessage="密碼為必填欄位" Text="(必填)" ForeColor="Red" Font-Size="10pt"></asp:RequiredFieldValidator>
                         <asp:RegularExpressionValidator ID="RegularExpressionValidator3" ControlToValidate="txtPwd" ValidationExpression="\S{8,12}" runat="server" ErrorMessage="(密碼不可含有空白)" ForeColor="Red" Font-Size="10pt"></asp:RegularExpressionValidator>
                     </td>
                </tr>
                <tr>
                    <td>密碼確認:</td>
                    <td>
                        <asp:TextBox ID="txtPwd2" runat="server" TextMode="Password" placeholder="請再輸入一次密碼"></asp:TextBox>
                      <%--   <asp:RequiredFieldValidator ID="RequiredFieldValidator6" ControlToValidate="txtPwd2" runat="server" ErrorMessage="(必填)" ForeColor="Red" Font-Size="10pt"></asp:RequiredFieldValidator>--%>
                          <asp:CompareValidator ID="CompareValidator3" runat="server" Operator="Equal" ControlToCompare="txtPwd2"  ControlToValidate="txtPwd" ErrorMessage="(兩次密碼輸入不相同)" ForeColor="Red" Font-Size="10pt"></asp:CompareValidator>
                    </td>
                </tr>
             
                <tr>
                    <td>姓名:</td>
                    <td>
                         <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
                        <asp:RequiredFieldValidator ID="RequiredFieldValidator4" ControlToValidate="txtName" runat="server" ErrorMessage="(必填)" ForeColor="Red" Font-Size="10pt"></asp:RequiredFieldValidator>
                    </td>
                </tr>
                 <tr>
                    <td>生日:</td>
                    <td>
                         <asp:TextBox ID="txtBirthday" runat="server" placeholder="1990-01-12"></asp:TextBox>
                         <asp:RequiredFieldValidator ID="RequiredFieldValidator5" ControlToValidate="txtBirthday" Display="Dynamic" runat="server" ErrorMessage="(必填)" ForeColor="Red" Font-Size="10pt"></asp:RequiredFieldValidator>
                         <asp:CompareValidator ID="CompareValidator1" Display="Dynamic" runat="server" Operator="DataTypeCheck" Type="Date" ControlToValidate="txtBirthday" ErrorMessage="(格式錯誤)" ForeColor="Red" Font-Size="10pt"></asp:CompareValidator>
                       
                    </td>
                </tr>
                <tr>
                    <td>E-mail:</td>
                    <td>
                         <asp:TextBox ID="txtEmail" runat="server" placeholder="abc@abc.com"></asp:TextBox>
                        <asp:RegularExpressionValidator ID="RegularExpressionValidator4" ControlToValidate="txtEmail" ValidationExpression="([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)" runat="server" ErrorMessage="(格式有誤)" ForeColor="Red" Font-Size="10pt"></asp:RegularExpressionValidator>
                    </td>
                </tr>
                <tr>
                    <td>性別:</td>
                    <td>
                        <asp:RadioButtonList ID="rblGender" runat="server" RepeatDirection="Horizontal" Width="120">
                            <asp:ListItem Text="男" Value="1" Selected="True"></asp:ListItem>
                            <asp:ListItem Text="女" Value="0"></asp:ListItem>
                        </asp:RadioButtonList>
                    </td>
                </tr>
                <tr>
                    <td>學歷:</td>
                    <td>
                        <asp:DropDownList ID="ddlEduLevel" runat="server">
                        <asp:ListItem Text="請選擇"></asp:ListItem>
                        </asp:DropDownList>
                         <asp:CompareValidator ID="CompareValidator2" runat="server" Operator="NotEqual" ValueToCompare="請選擇"  ControlToValidate="ddlEduLevel" ErrorMessage="(請選擇)" ForeColor="Red" Font-Size="10pt"></asp:CompareValidator>
                    </td>
                  
                </tr>
                 <tr>
                    <td>照片:</td>
                    <td>
                        <asp:FileUpload ID="fulPhoto" runat="server" /><asp:Label ID="lblPhoto" Font-Size="10pt" ForeColor="Red" runat="server"></asp:Label>
                    </td>
                  
                </tr>
               <tr>
                    <td>備註:</td>
                    <td>
                        <asp:TextBox ID="txtNote" TextMode="MultiLine" runat="server" Width="200" Height="150"></asp:TextBox>
                       </td>
                  
                </tr>
                 <tr>
                    <td colspan="2">
                        <asp:Button ID="Button1" runat="server" Text="加入會員" OnClick="Button1_Click"  />
                        <input id="Reset1" type="reset" value="重設" />
                    </td>                  
                </tr>
                
            </table>
        </div>
    </form>
</body>
</html>

最後後端程式碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Data.SqlClient;
using System.Configuration;

namespace ASPnet
{
    public partial class _33Member_Registeration : System.Web.UI.Page
    {
        SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySystemConnectionString1"].ConnectionString);

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySystemConnectionString1"].ConnectionString);
                SqlCommand Cmd = new SqlCommand("select * from Edu order by EduLevel_Code desc", Conn);

                SqlDataReader rd;
                Conn.Open();
                rd = Cmd.ExecuteReader();
                ListItem item;
                while (rd.Read())
                {
                    item = new ListItem(rd["EduLevel"].ToString(), rd["EduLevel_Code"].ToString());
                    ddlEduLevel.Items.Add(item);
                }

                Conn.Close();
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            if (this.IsValid)
            {
                if (fulPhoto.PostedFile.ContentType != "application/octet-stream" && fulPhoto.PostedFile.ContentType == "image/jpeg")
                {
                    try
                    {
                        lblPhoto.Text = "";
                        SqlCommand Cmd = new SqlCommand("insert into members values(@account,hashbytes('sha2_256',@pwd),@name,@birthday,@email,@gender,@edu,@note,@photo)", Conn);
                        Cmd.Parameters.AddWithValue("@account", txtAccount.Text);
                        Cmd.Parameters.AddWithValue("@pwd", txtPwd.Text);
                        Cmd.Parameters.AddWithValue("@name", txtName.Text);
                        Cmd.Parameters.AddWithValue("@birthday", txtBirthday.Text);
                        Cmd.Parameters.AddWithValue("@email", txtEmail.Text);
                        Cmd.Parameters.AddWithValue("@gender", rblGender.SelectedValue);
                        Cmd.Parameters.AddWithValue("@edu", ddlEduLevel.SelectedValue);
                        Cmd.Parameters.AddWithValue("@note", txtNote.Text);
                        if (fulPhoto.PostedFile.ContentType == "application/octet-stream")
                            Cmd.Parameters.AddWithValue("@photo", null);
                        else
                            Cmd.Parameters.AddWithValue("@photo", fulPhoto.FileBytes);

                        Conn.Open();
                        Cmd.ExecuteNonQuery();

                        Conn.Close();

                        //Response.Redirect("17GridView_DataSource.aspx");
                    }
                    catch (Exception ex)
                    {
                        Response.Write(ex.Message);
                    }
                }
                else
                    lblPhoto.Text = "格式有錯!!";
            }

            
        }

        protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
        {
            SqlCommand Cmd = new SqlCommand("select dbo.fnCheckMemberAccount(@account)", Conn);
            Cmd.Parameters.AddWithValue("@account", txtAccount.Text);

            SqlDataReader rd;
            Conn.Open();
            rd = Cmd.ExecuteReader();

            rd.Read();
            if (rd[0].ToString() == "0")
                args.IsValid = true;
            else
                args.IsValid = false;

            Conn.Close();
        }
    }
}


//create function fnCheckMemberAccount
//    (@account varchar(10))
//	returns int
//as
//begin
//    declare @aa varchar(10)

//    select @aa = account from Members where account = @account
	
//	if @@ROWCOUNT=0
//		return 0

//	return 1
//end

下集帶續 寄驗證碼 送認證信

jQuer
https://www.googleapis.com/books/v1/volumes?q=書名
https://cnodejs.org/topic/571ba1b35a26c4a841ecbc57
ajax - Google SearchGoogle
Logo