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
  • #Bootstrap components 元/組件
  • ##標籤/元素 data 屬性
  • ##alert 警報 警告 bs class
  • ##題外話 如果用 jq開發 一個空白網站應該至少要有
  • ##badge ( 小按鈕 小提示
  • ##BreadCrumb 麵包屑
  • ##button
  • ##Dropdown menu 下拉式按鈕
  • #MVC API 概念
  • ##API 實作
  • ##小結論:
  • ##寫前端的jq查詢 ( 只要傳id
  • ##Form 不用寫 action 也不用寫 mether 也不用submit 因為都是藉由 ajax
  • ##寫新增的jq方法 ( 只要id
  • ##接著要修改資料 ( 最麻煩 要id又要model
  • ##最後是刪除 ( 只要id
  • ##題外話 繫結

Was this helpful?

  1. 職訓局里程碑
  2. 201905

2019/0522/Bootstrap Components 元件介紹 + MVC API 概念&實作

Previous2019/0521/抽象類別+介面Next2019/0523/IIS IP限制&ASP.NET部屬

Last updated 5 years ago

Was this helpful?

響應式上午 ( bs + js or jq ( 利用bs已經寫好的函式庫完成

#Bootstrap components 元/組件

##標籤/元素 data 屬性

##alert 警報 警告 bs class

###keyword

alert-danger

alert-dark

alert-info

alert-success

&開頭;結尾 ( × 特殊符號 X

#bs js庫 ( 第一次講 ( alert關閉功能

data 開頭的屬性 ( 事件發生做甚麼

data-dismiss=”alert” ( 被消失

沒反應? ( 要link jq庫近來 後再進 bs庫 ( js 寫 jq庫 , jq庫 寫 bs庫

再來完成某個小功能

下id在 alert class div上

用jq選擇器 當選擇器被關掉時 執行某funtion

Log ? api 存到資料庫

###/RWD/20Alert.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title></title>
    <link href="Content/bootstrap.min.css" rel="stylesheet" />
    <link href="MyStyle.css" rel="stylesheet" />
</head>
<body>
    <div class="container">
        <div class="alert alert-danger">
            您現在是最高權限,用完後請馬上登出!!

        </div>
        <div class="alert alert-warning">
            您現在是最高權限,用完後請馬上登出!!

        </div>
        <div class="alert alert-info">
            您現在是最高權限,用完後請馬上登出!!

        </div>
        <div class="alert alert-dark">
            您現在是最高權限,用完後請馬上登出!!

        </div>
        <hr />

        <div class="alert alert-danger">
            您現在是最高權限,用完後請馬上登出!!<a href="#" class="alert-link">點我登出系統</a>

        </div>
        <div class="alert alert-info">
            您現在是最高權限,用完後請馬上登出!!<a href="#" class="alert-link">點我登出系統</a>

        </div>
        <hr />
        <div class="alert alert-success">
            <h4>您好!!系統管理員!!</h4>
            <p>您現在是最高權限,用完後請馬上登出!!</p>
            <hr />
            <p>目前登入系統是危險的!!請注意密碼外洩或其他資安問題</p>
        </div>

        <div class="alert alert-dark">
            您現在是最高權限,用完後請馬上登出!!
            <button type="button" class="close" data-dismiss="alert">
                &times;
            </button>
        </div>

        <div class="alert alert-danger" id="myAlert">
            <button type="button" class="close" data-dismiss="alert">
                &times;
            </button>
            <h4>您好!!系統管理員!!</h4>
            <p>您現在是最高權限,用完後請馬上登出!!</p>
            <hr />
            <p>目前登入系統是危險的!!請注意密碼外洩或其他資安問題</p>

        </div>

    </div>
   

    <script src="Scripts/jquery-3.0.0.min.js"></script>
    <script src="Scripts/bootstrap.min.js"></script>
    <script>
        $('#myAlert').on('closed.bs.alert', function () {
            alert("您關閉了系統警告訊息!!記得用完後馬上登出系統!!");


        });
    </script>
</body>
</html>

以上其實就是jq show 跟 hide 還能跑特效 fade in fade out

只是說用它的可以很快,而且它沒寫的就沒得用還是要自己寫

##題外話 如果用 jq開發 一個空白網站應該至少要有

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title></title>
    <link href="Content/bootstrap.min.css" rel="stylesheet" />
    <link href="MyStyle.css" rel="stylesheet" />
</head>
<body>
    <div class="container">
        

    </div>
   

    <script src="Scripts/jquery-3.0.0.min.js"></script>
    <script src="Scripts/bootstrap.min.js"></script>
    
</body>
</html>

##badge ( 小按鈕 小提示

###keyword

Badge

Badge-danger

.

.

.

Ex 站內信 ( 已讀未讀

sr seo 排名 ??? class sr-only 會被盲用電腦讀出

### /RWD/21Badge.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title></title>
    <link href="Content/bootstrap.min.css" rel="stylesheet" />
    <link href="MyStyle.css" rel="stylesheet" />
</head>
<body>
    <div class="container">
        <h1>This is a h1 heading!!<span class="badge badge-danger">New</span></h1>

        <button class="btn btn-primary">
            未讀郵件<span class="badge badge-light">5</span>
        </button>

        <button class="btn btn-success">
            未讀郵件<span class="badge badge-light">5</span>
        </button>
        <button class="btn btn-danger">
            未讀郵件<span class="badge badge-light">5</span>
            <span class="sr-only">未讀郵件5封</span>
        </button>
        <hr>
        <span class="badge badge-primary">primary</span>
        <span class="badge badge-success">success</span>
        <span class="badge badge-info">info</span>
        <hr>
        <span class="badge badge-primary badge-pill">primary</span>
        <span class="badge badge-pill badge-success">success</span>
        <span class="badge badge-info badge-pill">info</span>
        <hr>
        <a href="#" class="badge badge-primary">primary</a>
        <a href="#"  class="badge badge-success">success</a>
        <a  href="#" class="badge badge-info">info</a>

    </div>
   

    <script src="Scripts/jquery-3.0.0.min.js"></script>
    <script src="Scripts/bootstrap.min.js"></script>
    
</body>
</html>

##BreadCrumb 麵包屑

網站設計是一層一層的Sitemap邏輯性的

但是實體的網站其實是網狀的藉由Url可以直接跳轉

而網站地圖就是麵包屑

網站地圖一定跟選單有關

架構 ( 階層 SiteMap => Menu選單

###keyword

breadcrumb

breadcrumb-item

breadcrumb 搭配 超連結

active作用中(自己去寫? (每個 combind的效果都不一樣 要去參考庫上的屬性

4版本的跟3版本的改的地方不一樣但其實就是原生的css或js寫的庫

不改的屬性不用貼進來 不用重複寫比較不會出錯

ctrl+f5 指重新整理 head

Shift 整個網頁重讀

##button

##keyword 有點多看範例程式碼

行動裝置上常用 block 區塊型的

Bs4專屬 啟用跟非啟用狀態 active > 點擊後tago combind呈現 active

Disabled 功能拿掉但外觀一樣

###/RWD/23Button.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title></title>
    <link href="Content/bootstrap.min.css" rel="stylesheet" />
    <link href="MyStyle.css" rel="stylesheet" />
</head>
<body>
    <div class="container">
        <button type="button" class="btn btn-primary">Primary</button>
        <button type="button" class="btn btn-secondary">Secondary</button>
        <button type="button" class="btn btn-success">Success</button>
        <button type="button" class="btn btn-danger">Danger</button>
        <button type="button" class="btn btn-warning">Warning</button>
        <button type="button" class="btn btn-info">Info</button>
        <button type="button" class="btn btn-light">Light</button>
        <button type="button" class="btn btn-dark">Dark</button>

        <button type="button" class="btn btn-link">Link</button>
        <a href="button" class="btn btn-warning">Warning</a>
        <hr />

        <button type="button" class="btn btn-outline-primary">Primary</button>
        <button type="button" class="btn btn-outline-secondary">Secondary</button>
        <button type="button" class="btn btn-outline-success">Success</button>
        <button type="button" class="btn btn-warning btn-lg">Warning</button>
        <button type="button" class="btn btn-info btn-sm">Info</button>
        <hr />
        <button type="button" class="btn btn-outline-success btn-block">Success</button>
        <button type="button" class="btn btn-warning btn-block">Warning</button>
        <hr />

        <button type="button" class="btn btn-outline-primary">Primary</button>
        <button type="button" class="btn btn-outline-primary active">Primary</button>

        <button type="button" class="btn btn-warning disabled" disabled>Warning</button>
        <hr />
        <div class="btn-group btn-group-toggle" data-toggle="buttons">
            <label class="btn btn-secondary">
                <input id="Checkbox" type="checkbox" autocomplete="off" /> 沒女友
            </label>
            <label class="btn btn-secondary">
                <input id="Checkbox2" type="checkbox" autocomplete="off" /> 多金
            </label>
            <label class="btn btn-secondary">
                <input id="Checkbox3" type="checkbox" autocomplete="off" /> 位高
            </label>
            <label class="btn btn-secondary">
                <input id="Checkbox3" type="checkbox" autocomplete="off" /> 權重
            </label>
        </div>

    </div>
   

    <script src="Scripts/jquery-3.0.0.min.js"></script>
    <script src="Scripts/bootstrap.min.js"></script>
    
</body>
</html>

###題外話 Id 在 SEO中 第一個不要寫1 第二個寫2 3 4 這樣排名會高一些

互動就是一種功能一定會用到js

所以屬性要下 data

Data-toggle

最後把網頁介面改寫為行動裝置適合的頁面

##Dropdown menu 下拉式按鈕

###基本操作給base -> btn 然後再給顏色 btn-danger …

按下menu後才會顯示選單

###keyword

Dropdown-menu

Dropdown-item

但是這時只是隱藏 ( 點擊時觸發 所以又是js

data-target

##bs裡面 class 掌管外觀 data 掌控功能

非常多種還是要去bs官網看

##早上的debug

是popper.js函式庫壞掉 ?

結果用cdn引入就好了

結果就用bundle ( 所有的函式庫總庫

結果可以

所以判斷就是poper壞了

偵錯原則

1.f12 console 不能有紅色

2.看DOM

###/RWD/24Dropdown.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title></title>
    <link href="Content/bootstrap.min.css" rel="stylesheet" />
    <link href="MyStyle.css" rel="stylesheet" />
</head>
<body>
    <div class="container">
        <div class="dropdown">
            <button class="btn btn-primary dropdown-toggle" data-toggle="dropdown" id="ddMenu1">
                Menu

            </button>
            <div class="dropdown-menu" aria-labelledby="ddMenu1">
                <a href="#" class="dropdown-item">Action</a>
                <a href="#" class="dropdown-item">Another action</a>
                <a href="#" class="dropdown-item">Something else here</a>
                <a href="#" class="dropdown-item">Separated link</a>
            </div>

        </div>




    </div>


    <script src="Scripts/jquery-3.0.0.min.js"></script>
    <script src="Scripts/bootstrap.bundle.min.js"></script>
    <!--<script src="Scripts/popper.js"></script>-->
    <!--<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous"></script>
    <script src="Scripts/bootstrap.min.js"></script>-->


    <!--<script src="Scripts/bootstrap.bundle.min.js"></script>-->
    <!--<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous"></script>-->
    <!--<script src="Scripts/popper.js"></script>-->
    <!--<script src="Scripts/bootstrap.min.js"></script>-->




</body>
</html>

下次這個地方會在講一次 ( 講一半

#MVC API 概念

!!!!!!!!!!!!!!!!!!!!!!!!!大重點!!!!!!!!!!!!!!!!!!!!!!!!!!

學會就成為全端工程師 ???

Webserver 不太算 api

現在講的api是 restful l

程式在哪裡被執行的判斷前後端

但 restfull

夯的原因 可用於異質性設備

UI給人用的介面user interface

API 給程式用的看的介面 給瀏覽器看的 寫一個會看程式的 JAVA or C#

Application INTERFACE

擴充性很高 要盡量寫成 api

XML 階層太多 所以現在流行用 JOSON

API的 Request 是透過 URL

之前都是我們去接 API的資料 JASON

今天我們要當那個 拋的

##API 實作

這個其實有API範本

Global.asax 整個網站的組態 ( 應用程式被執行時會先來這裡

Webapi 與 Route的組態交給這裡

### /07WebAPI/Global.asax

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using System.Web.SessionState;
using System.Web.Http;

namespace _07WebAPI
{
    public class Global : HttpApplication
    {
        void Application_Start(object sender, EventArgs e)
        {
            // 應用程式啟動時執行的程式碼
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            RouteConfig.RegisterRoutes(RouteTable.Routes);            
        }
    }
}

接著看 api 跟 Route的組態

路由設定隱藏路徑 下一次會講

### /07WebAPI/App_Start/RouteConfig.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace _07WebAPI
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

我們今天先看 api的 ( 路徑一定要依樣

### /07WebAPI/App_Start/WebApiConfig.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace _07WebAPI
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API 設定和服務

            // Web API 路由
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
}

Web.config 給iis看的server的

IQueryable 底層實作都是回復一個集合

差別在於

IEnumerable 抓資料進記憶體

但有時候查詢時 就會不一樣

iv會全抓再去查出來再塞給view

ie會先把查詢linq轉為 tsql command 抓查詢的東西再塞給記憶體

節省記憶體但效能會慢一點

List只能用Ie

所以直接 return 即可 它因為繼承apicontroller 所以不用 return view 因為只會回傳值

要用IHttpActionResult介面

NotFound() 方法丟404

Ok() 方法

失敗error

成功success 200

不用寫 else 因為看到 return就結束了 不然不會結束反而會報錯

沒有view直接編譯候用url呼叫

到webapiconfig.cs 編輯拋出格式

接著用前端呼叫API試試看

用JQ寫AJAX呼叫

寫偵錯 console.log 等等如出錯比較好偵錯

Data.forEach() 把資料利用jason讀的方式讀出來 ( 之前有教 jason的階層) 讀出來

### /07WebAPI/HtmlPage1.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <link href="Content/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
    <ul id="list">

    </ul>
    <script src="Scripts/jquery-1.9.1.min.js"></script>
    <script>
        $.ajax({
            type: "GET",
            url: "http://localhost:55270/api/Student/",
            success: function (data) {
                console.log(data);
                data.forEach(function (item){
                    $('#list').append("<li>學號:" + item.學號 + ", 姓名:" + item.姓名 + ", 性別:" + item.性別 + ", 生日:" + item.生日 + ", 電話:" + item.電話 +"</li>");

                })

            }
        });

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

###安全性問題

必須透過url呼叫 無法直接開啟

###建億的錄影影片

##小結論:

前端就是在寫介接 scrip ( 純前端

拋資料 ( 純後端

Api讓前後端可以完全切開

弄個bs排版之類的應該就是 ( 網頁設計師 ….

接著再回到HtmlPage1.html

##寫前端的jq查詢 ( 只要傳id

雖然是後端要資料 但是 是在後台運作的ajax 所以並不會postback 使用者ux感覺良好

### /07WebAPI/HtmlPage1.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <link href="Content/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
    <input id="id" type="text" placeholder="請輸入學號" />
    <input id="btnGet" type="button" value="查詢" />
    <ul id="list">

    </ul>
    <script src="Scripts/jquery-1.9.1.min.js"></script>
    <script>
        $.ajax({
            type: "GET",
            url: "http://localhost:55270/api/Student/",
            success: function (data) {
                console.log(data);
                data.forEach(function (item){
                    $('#list').append("<li>學號:" + item.學號 + ", 姓名:" + item.姓名 + ", 性別:" + item.性別 + ", 生日:" + item.生日 + ", 電話:" + item.電話 +"</li>");

                })

            }
        });

        $('#btnGet').click(function () {
            $.ajax({
                type: "GET",
                url: "http://localhost:55270/api/Student/"+$('#id').val(),
                success: function (item) {
                    console.log(item);
                    $('#list').empty();
                    //data.forEach(function (item) {
                        $('#list').append("<li>學號:" + item.學號 + ", 姓名:" + item.姓名 + ", 性別:" + item.性別 + ", 生日:" + item.生日 + ", 電話:" + item.電話 + "</li>");

                    //})

                }
            });
        });


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

以上講的都是讀取

接著三個都是寫進去 增加一筆 既有資料修改 既有資料刪除

複雜隙結法傳整個類別

刪除只要傳id所以不用傳整個類別

這三個都是void 如果要回傳值就可以同時顯示資料庫狀況

填表單通常就要驗證資料 ( 前端會做初步塞選

但前端可能會失誤所以最好還是要防範

( 公開資料通常只會拋資料出來 介接網址跟使用文件 無法寫回去

ModelState.IsValid ( 布林值 )

回傳funtion結構關係所以if 都要先寫反的 ( 如果沒有

Return BadRequest(ModelState);丟錯誤訊息回去

接著如果驗證通過

db.學生.Add(stu);

常犯錯誤 pk 重複或缺少

所以我們就可以把已下放在 try crach

通過才執行db.SaveChanges();

catch(DbUpdateException)

Conflict()將錯誤訊息回傳

如果是沒辦法判斷的例外 利用以下

Throw 把例外直接拋出

Return CreatedAtRoute(“DefaultApi”,new {id=stu.學號});

接著 下一個 既有資料修改

把 新增一筆資料 拿來改即可

驗證如果傳進來的id與stu的學號 不同 拋 badrequest()

db.Entry(stu).State=EntityState.Modified 狀態改成修改

以下相同 最後

要 return statuscode (HttpStatuscode.nocontent);

最後一個 抓學號 然後刪掉

跟查詢資料很像

最後也是return Ok(stu);

後端api至此 ok

回到前端HtmlPage1.html

純前端有壞處 沒razor可以寫所以遇到功能只能寫js

簡單用 bootstrap排版

##Form 不用寫 action 也不用寫 mether 也不用submit 因為都是藉由 ajax

接著

##寫新增的jq方法 ( 只要id

新增type要用post

Request 一定是 url

Data只要呼叫 form id 使用.serialize()資料序列化?(直接幫你把帶的參數寫好的方法

Api / student?學號=s010&姓名=abcd8

這裡又出現bug 可能是jq1.9版本 序列化會怪怪的

結果原來是標籤沒有name所以後端擷取不到

##接著要修改資料 ( 最麻煩 要id又要model

我們把上面的修改一下在查詢時就把資料讀在表單內 ( 原本是獨立在最下面

val() 沒傳參數是取值,有傳參數是給值

##最後是刪除 ( 只要id

跟剛剛新增差不多

整個就是

###/07WebAPI/Controllers/StudentController.cs

using _07WebAPI.Models;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace _07WebAPI.Controllers
{
    public class StudentController : ApiController
    {
        教務系統Entities db = new 教務系統Entities();

        // GET: api/Student
        public IQueryable<學生> Get()
        {
            return db.學生;
        }

        // GET: api/Student/5
        public IHttpActionResult Get(string id)
        {
            學生 stu = db.學生.Find(id);
            if (stu == null)
                return NotFound();
            
            return Ok(stu);
        }

        // POST: api/Student
        public IHttpActionResult Post([FromBody]學生 stu)
        {
            if(!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            db.學生.Add(stu);
            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateException)
            {
                if(db.學生.Count(s=>s.學號==stu.學號)>0)
                {
                    return Conflict();
                }
                else
                {
                    throw;
                }
            }

            return CreatedAtRoute("DefaultApi",new { id=stu.學號},stu);
        }

        // PUT: api/Student/5
        public IHttpActionResult Put(string id, [FromBody]學生 stu)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
           
            if(id!=stu.學號)
            {
                return BadRequest();
            }

            db.Entry(stu).State = EntityState.Modified;

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateException)
            {
                if (db.學生.Count(s => s.學號 == stu.學號) > 0)
                {
                    return Conflict();
                }
                else
                {
                    throw;
                }
            }

            return StatusCode(HttpStatusCode.NoContent);


        }

        // DELETE: api/Student/5
        public IHttpActionResult Delete(string id)
        {
            學生 stu = db.學生.Find(id);
            if (stu == null)
                return NotFound();

            db.學生.Remove(stu);
            db.SaveChanges();

            return Ok(stu);
        }
    }
}

###/07WebAPI/HtmlPage1.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <link href="Content/bootstrap.min.css" rel="stylesheet" />
</head>
<body>
    <div class="container">
        <form id="form1">
            學號:<input id="sid" name="學號" type="text" /><br />
            姓名:<input id="name" name="姓名" type="text" /><br />
            性別:<input id="gender" name="性別" type="text" /><br />
            電話:<input id="tel" name="電話" type="text" /><br />
            生日:<input id="birthday" name="生日" type="text" /><br />

            <input id="btnAdd" type="button" value="新增" />
            <input id="btnUp" type="button" value="修改" />
            <input id="btnDel" type="button" value="刪除" />
        </form>
        <hr />
        <input id="id" type="text" placeholder="請輸入學號" />
        <input id="btnGet" type="button" value="查詢" />
        <ul id="list"></ul>
    </div>

    <script src="Scripts/jquery-3.4.1.js"></script>
    <script>
        $.ajax({
            type: "GET",
            url: "http://localhost:55270/api/Student/",
            success: function (data) {
                console.log(data);
                data.forEach(function (item) {
                    $('#list').append("<li>學號:" + item.學號 + ", 姓名:" + item.姓名 + ", 性別:" + item.性別 + ", 生日:" + item.生日 + ", 電話:" + item.電話 + "</li>");

                })

            }
        });

        $('#btnGet').click(function () {
            $.ajax({
                type: "GET",
                url: "/api/Student/" + $('#id').val(),
                success: function (item) {
                    console.log(item);
                    $('#list').empty();
                    //data.forEach(function (item) {
                    $('#list').append("<li>學號:" + item.學號 + ", 姓名:" + item.姓名 + ", 性別:" + item.性別 + ", 生日:" + item.生日 + ", 電話:" + item.電話 + "</li>");
                    $('#sid').val(item.學號);
                    $('#name').val(item.姓名);
                    $('#tel').val(item.電話);
                    $('#gender').val(item.性別);
                    $('#birthday').val(item.生日);
                    //})

                }
            });
        });


        $('#btnAdd').click(function () {
            console.log($('#form1').serialize());
            $.ajax({
                type: "POST",
                url: "/api/Student/",
                data: $('#form1').serialize()

            });

        });

        $('#btnUp').click(function () {
            console.log($('#form1').serialize());

            $.ajax({
                type: "PUT",
                url: "/api/Student/" + $('#sid').val(),
                data: $('#form1').serialize()

            });

        });

        $('#btnDel').click(function () {
            console.log($('#form1').serialize());

            $.ajax({
                type: "DELETE",
                url: "/api/Student/" + $('#sid').val()
               

            });

        });

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

本機 IIS Webserver 範例 ( 後端會傳這個給前端

##題外話 繫結

###複雜繫結

###簡單繫結

###下一次會講用異質性平台存取同一個api

標籤 data屬性 - Google SearchGoogle
Logo
簡單繫結 - Google SearchGoogle
Logo
複雜繫結 - Google SearchGoogle
Logo
[前端連載] 了解網頁發展的脈絡(上)——從靜態網頁到動態網頁到REST API沒一村生活點滴
Logo