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
  • #MVC Part2 ( 早上自習
  • #02_Controller
  • 現在要自己寫controller跟view
  • Controller 到此介紹完畢
  • ##03_ActionFilter 過濾器
  • ##直接寫 ADO.NET ??
  • ValueReporter:ActionFilterAttribute
  • 接著講
  • ##04_View
  • @RAZOR Helper
  • 到此ok 到時會講趴修view

Was this helpful?

  1. 職訓局里程碑
  2. 201906

2019/0604/ASP.NET_MVC Part2 PhotoSharing Controller & Filter & ADO.NET & View@RAZOR Helper

#MVC Part2 ( 早上自習

#02_Controller

前情提要CodeFirst

現在要自己寫controller跟view

###回覆留言用Ajax方式 ( ??? 可能之後要做

ViewData帶去View就消失了

##接著先做controller

###PhotosController.cs action create()

新增留言

首先 新增一筆新增時間到view用於顯示

接著處理httppost

[ ]可以用 , [ , ]寫 但通常還是要同一組

HttpPostedFileBase利用此物件接image檔案

photo.ImageMimeType = image.ContentType; 抓副檔名

照片轉為byte陣列

存到模型後 存入資料庫 然後轉到index

那如果驗證不通過就停留在create

記得這裡也要餵今天日期不然抓不到

新增範本檢視再做更改 ( 覆蓋之前範本產生的

Bundle ?? 之後會講 可以把 庫弄成一包 ?在 app_start bundle.config

下個單元才會自己寫view ?

接著寫

刪除確認畫面

比較特別無法做多載?

Get 部分做 例外回傳

Httppost 這裡如果 參數一樣是不能做多載的 那怎辦呢 ?

直接修改action頁面即可

補充[ActionName("Delete")]

然後查找並刪除。

回到index

接著新增範本view 去做一些細部修改

後面要講錯處理的進階作法

Controller 到此介紹完畢

接著講View並把之前沒講到的補講

###02_Controller/PhotoSharing/Controllers/PhotosController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using PhotoSharing.Models;
using PhotoSharing.DAL;
using System.Net;


namespace PhotoSharing.Controllers
{
    public class PhotosController : Controller
    {
        //2.2建立Data Context 來自 Photo Model 的 PhotoSharingContext 
        PhotoSharingContext context = new PhotoSharingContext();

        // GET: Photos
        //2.3-1 Index()回傳Photo
        public ActionResult Index()
        {
            ViewBag.Date = DateTime.Now;  //用ViewBag帶入今日日期
            return View(context.Photos.ToList());
        }

        //2.3-2 Display(int id) 透過id參數回傳Photo,若找不到回傳HttpNotFound()helper
        public ActionResult Display(int? id)
        {
            ViewData["Date"] = DateTime.Now; //用ViewData帶入今日日期
            if (id==null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            Photo photo = context.Photos.Find(id);
            if(photo==null)
            {
                return HttpNotFound();
            }

            return View("Display", photo);
        }
        //2.3-7 建立GetImage(int id)回傳File(photo.PhotoFile, photo.ImageMimeType)
        //這不是View()Helper的ActionResult, 這是File()helper
        public FileContentResult GetImage(int id)
        {
            Photo photo = context.Photos.Find(id);
            return File(photo.PhotoFile, photo.ImageMimeType);
        }

        //2.3-3 GET:Create() 產生新增Photo作業,並回傳 new Photo()並產生CreatedDate屬性值= DateTime.Today
        public ActionResult Create()
        {
            Photo newPhoto = new Photo();
            newPhoto.CreatedDate = DateTime.Today;
            
            return View("Create",newPhoto);
        }
        //2.3-4 Post:Create(Photo photo, HttpPostedFileBase image),使用HTTP POST,執行新增Photo回存作業,回傳RedirectToAction()helper
        //      如果ModelState.IsValid==false,回傳Photo給View, 反之執行新增Photo回存作業
        //      photo.ImageMimeType = image.ContentType;
        //      photo.PhotoFile = new byte[image.ContentLength];
        //      image.InputStream.Read(photo.PhotoFile, 0, image.ContentLength);
        [HttpPost,ValidateAntiForgeryToken]
        public ActionResult Create(Photo photo,HttpPostedFileBase image)
        {
            photo.CreatedDate = DateTime.Today;
            if(ModelState.IsValid)
            {
                //有post照片才做照片上傳的處理
                if (image!=null)
                {
                    photo.ImageMimeType = image.ContentType;  //抓照片型態
                    photo.PhotoFile = new byte[image.ContentLength];  //取得上傳照片的大小再轉byte陣列
                    image.InputStream.Read(photo.PhotoFile, 0, image.ContentLength);
                }
                context.Photos.Add(photo);
                context.SaveChanges();
                return RedirectToAction("Index");

            }
            else
            {
                return View("Create", photo);
            }


            
        }
        //2.3-5 Get:Delete(int id)產生刪除Photo作業,並回傳Photo(),若找不到回傳HttpNotFound()helper
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            Photo photo = context.Photos.Find(id);
            if (photo == null)
            {
                return HttpNotFound();
            }

            return View("Delete", photo);
        }
        //2.3-6 Post:建立DeleteConfirmed(int id)使用[ActionName("Delete")]屬性,透過HTTP POST,執行刪除Photo回存作業.回傳RedirectToAction()helper
        [HttpPost,ValidateAntiForgeryToken]
        [ActionName("Delete")]
        public ActionResult DeleteConfirmed(int? id)
        {
            Photo photo = context.Photos.Find(id);
            context.Photos.Remove(photo);
            context.SaveChanges();
            return RedirectToAction("Index");
        }


    }
}

###老師講解

//2.1.加入 Empty MVC controller -> PhotoController(PhotoController.cs)
//2.2.建立Data Context 來自 Photo Model 的 PhotoSharingContext 
//2.3.建立action
//2.3-1 Index()回傳Photo
//2.3-2 Display(int id) 透過id參數回傳Photo,若找不到回傳HttpNotFound()helper
//2.3-3 Create() 產生新增Photo作業,並回傳 new Photo()並產生CreatedDate屬性值= DateTime.Today
//2.3-4 Create(Photo photo, HttpPostedFileBase image),使用HTTP POST,執行新增Photo回存作業,回傳RedirectToAction()helper
//      如果ModelState.IsValid==false,回傳Photo給View,反之執行新增Photo回存作業
//      photo.ImageMimeType = image.ContentType;
//      photo.PhotoFile = new byte[image.ContentLength];
//      image.InputStream.Read(photo.PhotoFile, 0, image.ContentLength);
//2.3-5 Delete(int id)產生刪除Photo作業,並回傳Photo(),若找不到回傳HttpNotFound()helper
//2.3-6 建立DeleteConfirmed(int id)使用[ActionName("Delete")]屬性,透過HTTP POST,執行刪除Photo回存作業.回傳RedirectToAction()helper
//2.3-7 建立GetImage(int id)回傳File(photo.PhotoFile, photo.ImageMimeType)(注意:File()helper 是FileContentResult,不是 View()helper 的ActionResult)


//2.4.建立Index及Display Views
//      Model Class:Photo (PhotoSharing.Models)
//      Data Context Class:PhotoSharingContext (PhotoSharing.DAL)
//2.4-1 Index View使用Scaffold template:List
//2.4-2 Display View使用Scaffold template:Details 


//2.5. 更改Index View
//2.5-1 取出ViewBag值
//2.5-2 註解:不顯示圖片
//2.5-3 在Index View(Index.cshtml)將ActionLink的Details改成Display


//2.6 更改Display View
//2.6-1 取出ViewData值
//2.6-2 在Display View(Display.cshtml)使用GetImage Action


//2.7.建立Delete Views
//      Model Class:Photo (PhotoSharing.Models)
//      Data Context Class:PhotoSharingContext (PhotoSharing.DAL)
//2.7-1 Delete View使用Scaffold template:Delete
//2.7-2 在Delete View(Delete.cshtml)使用GetImage Action

在講view前先講

##03_ActionFilter 過濾器

示意圖

Web.config 伺服器層級的組態設定

ApplicationInsights.config應用程式組態設定

Global.config 應用程式組態分類

HandleErroAttribute 錯誤幫助者

做個猛一點的範例

過濾器 抓取使用者全部動作存入資料庫 ( 網站被攻擊時可以查看並鎖ip

其實可以寫在controller裡面寫 但要寫幾千幾百??

範例

log 所有的請求 時間 ip host brower type

log 對那些 action 請求

首先新增資料庫 用於儲存log

寫一個一般類別而不是新增控制器 ( 差別在 繼承哪個 namespace

Using mvc

繼承 ActionFilterAttribute 驗證基底類別

做一個動作就要存資料庫一次

##直接寫 ADO.NET ??

Using System.data.sqlclient

連線資訊 (以下偷吃步

Using system con

以前是利用sqldatasourse 建立 connectionstrings

把sqldatasourse拉進去然後再設計那邊用選的選完後webconfig就會產生connectionstrings

現在要自己寫

直接 sqlconnection 物件自己重新寫一個

然後就能下 sqlcommand

接著寫個 void 函數 然後傳指令近來就做 打開 傳旨 然後關閉

寫action 把資料存到資料表 pk 跟時間都是自己產生的

所以只要傳入其他欄位

有兩種方式可以寫

第一種 複寫 onActionExecute ( 先後 紀錄

在外面寫一個logValies函數傳入ROUTEDATA用於?

首先清空 PARAMETERS

路徑 抓出 controller action parame的值

有可能是null但不用if的寫法

接著用 ado.net 存取方式 與 parameter參數資安用法

存值進去

回到

ValueReporter:ActionFilterAttribute

public override void OnActionExecuting(ActionExecutingContext filterContext)

public override void OnResultExecuted(ResultExecutedContext filterContext)

回到複寫那裏?? 看無 講太快 = =

在做一個 requestlog 抓 httpcontext 裡面的 7個值

封包 = httpcontext

抓ip host browser用ServerVariable 能抓啥要去查 MSDN

接著 requestType userHostaddress userhostname http method則直接抓即可

接著再做一次 ado.net 存取方式 與 parameter參數資安用法 存值

接著做複寫 ? OnResultExecuted(ResultExecutedContext filterContext)

呼叫 requestlog

接著要去 FilterConfig.cs 註冊我們這個自己建立的過濾器

要using 或namespase位址要對

註冊好後

哪裡要用到過濾器必須指定

[ValueReporter] 執行到哪就做過濾器

正面表列?負面表列 ( 會在講 = = ?

Action 層級 controller 層級 application層級的

存取資料庫報錯

位址問題 要修正 PhotoSharingContext 的 base

Locodb ?? entityframwork

但是我們用 connectionStrings 資料存取層

放進不同的事件內 ( 成功才寄 失敗不記之類的

所以才會有那麼多 function 因應不同事件做存取

我們的Filter 是 application 層級的 所以所有動作都會存入

近端存取 存取不到ip

###controllers/ValueReporter.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Data.SqlClient;
using System.Configuration;
using System.Web.Routing;

namespace PhotoSharing.Controllers
{
    //2.8-1 繼承System.Web.Mvc.ActionFilterAttribute(注意:命名空間 System.Web.Mvc)
    public class ValueReporter:ActionFilterAttribute
    {
        SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
        SqlCommand cmd = new SqlCommand();
        //2.8-2 建立一般方法executeSql()-可傳入SQL字串來輯編資料表
        void executeSql(string sql)
        {
            Conn.Open();

            cmd.Connection = Conn;
            cmd.CommandText = sql;
            cmd.ExecuteNonQuery();

            Conn.Close();
        }
        //2.8-4 覆寫OnActionExecuting方法,執行LogValues方法,透過ActionExecutingContext.RouteData屬性傳入RouteData物件
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //base.OnActionExecuting(filterContext);
            LogValues(filterContext.RouteData);
        }
        //2.8-3 自訂LogValues方法,透過RouteData物件將controller及action參數透過ADO.net送至PhotoSharing資料庫的ActionLog資料表
        void LogValues(RouteData routeData)
        {
            cmd.Parameters.Clear();
            var controllerName = routeData.Values["controller"];
            var actionName = routeData.Values["action"];
            var parame = routeData.Values["id"] == null ? "N/A" : routeData.Values["id"];

            string sql = "insert into actionLog(controllerName,actionName,parame) values(@controllerName,@actionName,@parame)";
            cmd.Parameters.AddWithValue("@controllerName", controllerName);
            cmd.Parameters.AddWithValue("@actionName", actionName);
            cmd.Parameters.AddWithValue("@parame", parame);

            executeSql(sql);
        }

        //2.8-5 自訂RequestLog方法,取出HttpContext.Current.Request,將ServerVariable透過ADO.net送至PhotoSharing資料庫的RequestLog資料表
        void RequestLog()
        {
            cmd.Parameters.Clear();
            var ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
            var host = HttpContext.Current.Request.ServerVariables["REMOTE_HOST"];
            var browser = HttpContext.Current.Request.ServerVariables["HTTP_USER_AGENT"];

            var requestType = HttpContext.Current.Request.RequestType;
            var userHostAddress = HttpContext.Current.Request.UserHostAddress;
            var userHostName = HttpContext.Current.Request.UserHostName;
            var httpMethod = HttpContext.Current.Request.HttpMethod;

            string sql = "insert into RequestLog(ip,host,browser,requestType,userHostAddress,userHostName,httpMethod) ";
            sql+= "values(@ip,@host,@browser,@requestType,@userHostAddress,@userHostName,@httpMethod)";
            cmd.Parameters.AddWithValue("@ip", ip);
            cmd.Parameters.AddWithValue("@host", host);
            cmd.Parameters.AddWithValue("@browser", browser);
            cmd.Parameters.AddWithValue("@requestType", requestType);
            cmd.Parameters.AddWithValue("@userHostAddress", userHostAddress);
            cmd.Parameters.AddWithValue("@userHostName", userHostName);
            cmd.Parameters.AddWithValue("@httpMethod", httpMethod);
    

            executeSql(sql);
        }
        //2.8-6 覆寫OnActionExecuted方法,執行RequestLog方法
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            RequestLog();
        }
      
    }
}

###ftp://mvc@10.10.3.189/03_ActionFilter/PhotoSharing/Controllers/PhotosController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using PhotoSharing.Models;
using PhotoSharing.DAL;
using System.Net;


namespace PhotoSharing.Controllers
{
  
    public class PhotosController : Controller
    {
        //2.2建立Data Context 來自 Photo Model 的 PhotoSharingContext 
        PhotoSharingContext context = new PhotoSharingContext();

        // GET: Photos
        //2.3-1 Index()回傳Photo
      
        public ActionResult Index()
        {
            ViewBag.Date = DateTime.Now;  //用ViewBag帶入今日日期
            return View(context.Photos.ToList());
        }

        //2.3-2 Display(int id) 透過id參數回傳Photo,若找不到回傳HttpNotFound()helper
       
        public ActionResult Display(int? id)
        {
            ViewData["Date"] = DateTime.Now; //用ViewData帶入今日日期
            if (id==null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            Photo photo = context.Photos.Find(id);
            if(photo==null)
            {
                return HttpNotFound();
            }

            return View("Display", photo);
        }
        //2.3-7 建立GetImage(int id)回傳File(photo.PhotoFile, photo.ImageMimeType)
        //這不是View()Helper的ActionResult, 這是File()helper
        public FileContentResult GetImage(int id)
        {
            Photo photo = context.Photos.Find(id);
            return File(photo.PhotoFile, photo.ImageMimeType);
        }

        //2.3-3 GET:Create() 產生新增Photo作業,並回傳 new Photo()並產生CreatedDate屬性值= DateTime.Today
        public ActionResult Create()
        {
            Photo newPhoto = new Photo();
            newPhoto.CreatedDate = DateTime.Today;
            
            return View("Create",newPhoto);
        }
        //2.3-4 Post:Create(Photo photo, HttpPostedFileBase image),使用HTTP POST,執行新增Photo回存作業,回傳RedirectToAction()helper
        //      如果ModelState.IsValid==false,回傳Photo給View, 反之執行新增Photo回存作業
        //      photo.ImageMimeType = image.ContentType;
        //      photo.PhotoFile = new byte[image.ContentLength];
        //      image.InputStream.Read(photo.PhotoFile, 0, image.ContentLength);
        [HttpPost,ValidateAntiForgeryToken]
        public ActionResult Create(Photo photo,HttpPostedFileBase image)
        {
            photo.CreatedDate = DateTime.Today;
            if(ModelState.IsValid)
            {
                //有post照片才做照片上傳的處理
                if (image!=null)
                {
                    photo.ImageMimeType = image.ContentType;  //抓照片型態
                    photo.PhotoFile = new byte[image.ContentLength];  //取得上傳照片的大小再轉byte陣列
                    image.InputStream.Read(photo.PhotoFile, 0, image.ContentLength);
                }
                context.Photos.Add(photo);
                context.SaveChanges();
                return RedirectToAction("Index");

            }
            else
            {
                return View("Create", photo);
            }


            
        }
        //2.3-5 Get:Delete(int id)產生刪除Photo作業,並回傳Photo(),若找不到回傳HttpNotFound()helper
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            Photo photo = context.Photos.Find(id);
            if (photo == null)
            {
                return HttpNotFound();
            }

            return View("Delete", photo);
        }
        //2.3-6 Post:建立DeleteConfirmed(int id)使用[ActionName("Delete")]屬性,透過HTTP POST,執行刪除Photo回存作業.回傳RedirectToAction()helper
        [HttpPost,ValidateAntiForgeryToken]
        [ActionName("Delete")]
        public ActionResult DeleteConfirmed(int? id)
        {
            Photo photo = context.Photos.Find(id);
            context.Photos.Remove(photo);
            context.SaveChanges();
            return RedirectToAction("Index");
        }


    }
}

###老師步驟

//2.1.加入 Empty MVC controller -> PhotoController(PhotoController.cs)
//2.2.建立Data Context 來自 Photo Model 的 PhotoSharingContext 
//2.3.建立action
//2.3-1 Index()回傳Photo
//2.3-2 Display(int id) 透過id參數回傳Photo,若找不到回傳HttpNotFound()helper
//2.3-3 Create() 產生新增Photo作業,並回傳 new Photo()並產生CreatedDate屬性值= DateTime.Today
//2.3-4 Create(Photo photo, HttpPostedFileBase image),使用HTTP POST,執行新增Photo回存作業,回傳RedirectToAction()helper
//      如果ModelState.IsValid==false,回傳Photo給View,反之執行新增Photo回存作業
//      photo.ImageMimeType = image.ContentType;
//      photo.PhotoFile = new byte[image.ContentLength];
//      image.InputStream.Read(photo.PhotoFile, 0, image.ContentLength);
//2.3-5 Delete(int id)產生刪除Photo作業,並回傳Photo(),若找不到回傳HttpNotFound()helper
//2.3-6 建立DeleteConfirmed(int id)使用[ActionName("Delete")]屬性,透過HTTP POST,執行刪除Photo回存作業.回傳RedirectToAction()helper
//2.3-7 建立GetImage(int id)回傳File(photo.PhotoFile, photo.ImageMimeType)(注意:File()helper 是FileContentResult,不是 View()helper 的ActionResult)


//2.4.建立Index及Display Views
//      Model Class:Photo (PhotoSharing.Models)
//      Data Context Class:PhotoSharingContext (PhotoSharing.DAL)
//2.4-1 Index View使用Scaffold template:List
//2.4-2 Display View使用Scaffold template:Details 


//2.5. 更改Index View
//2.5-1 取出ViewBag值
//2.5-2 註解:不顯示圖片
//2.5-3 在Index View(Index.cshtml)將ActionLink的Details改成Display


//2.6 更改Display View
//2.6-1 取出ViewData值
//2.6-2 在Display View(Display.cshtml)使用GetImage Action


//2.7.建立Delete Views
//      Model Class:Photo (PhotoSharing.Models)
//      Data Context Class:PhotoSharingContext (PhotoSharing.DAL)
//2.7-1 Delete View使用Scaffold template:Delete
//2.7-2 在Delete View(Delete.cshtml)使用GetImage Action

//2.8.Controllers-->Add Class-->建立ValueReporter Class(ValueReporter.cs),加入Action Filter Type
//2.8-1 繼承System.Web.Mvc.ActionFilterAttribute(注意:命名空間 System.Web.Mvc)
//2.8-2 建立一般方法executeSql()-可傳入SQL字串來輯編資料表
//2.8-3 自訂LogValues方法,透過RouteData物件將controller及action參數透過ADO.net送至PhotoSharing資料庫的ActionLog資料表
//2.8-4 覆寫OnActionExecuting方法,執行LogValues方法,透過ActionExecutingContext.RouteData屬性傳入RouteData物件
//2.8-5 自訂RequestLog方法,取出HttpContext.Current.Request,將ServerVariable透過ADO.net送至PhotoSharing資料庫的RequestLog資料表
//2.8-6 覆寫OnActionExecuted方法,執行RequestLog方法

//2.9 在PhotoSharing資料庫中建立ActionLog與RequestLog資料表
//Create table ActionLog(
//    ActionLogSN bigint identity primary key,
//    logTime datetime default getdate() not null,
//    controllerName varchar(30) not null,
//	actionName varchar(30) not null,
//	parame varchar(10) not null
//)
//go


//create table RequestLog(
//    RequestLogSN bigint identity primary key,
//    logTime datetime default getdate() not null,
//    [ip] varchar(20) not null,
//	host varchar(30) not null,
//	browser varchar(MAX) not null,
//	requestType varchar(20) not null,
//	userHostAddress varchar(20) not null,
//	userHostName varchar(30) not null,
//	httpMethod varchar(30) not null
//)
//go

//3.0 註冊Action Filter
//3.0-1 在PhotoController class註冊Action Filter Class[ValueReporter]
//    可註冊為Action層級或Controller層級

//3.0-2 在App_Start\FilterConfig.cs中Action Filter Class[ValueReporter]

//***將PhotoSharingContext.cs裡的public PhotoSharingContext() : base("PhotoSharing")
//改為public PhotoSharingContext() : base("ConnectionString")***//  此處的值要視Web.config而定

接著講

##04_View

@RAZOR Helper

##View單純很多

接著處理重建 display ( 手工打造 ( detail 需要 id

回到controller 的 display action 新增檢視

Empty 但 帶model的 並覆蓋 會把剛剛display的東西洗掉

###keyword

Fieldset legend

@Model.Title

@Url.Aciton()

Img-responsive/thumbnail

@Html.DisplayFor

@Html.DisplayNameFor

@Html.DisplayText

@Html.ActionLink

@model PhotoSharing.Models.Photo

@{
    ViewBag.Title = "Display";
}

<fieldset>
    <legend>
        「@Model.Title」
    </legend>
    <img src="@Url.Action("GetImage","Photos",new { id=Model.PhotoID})" class="img-responsive img-thumbnail" />
    <p>
        @Html.DisplayFor(model => model.Description)
    </p>
    <p>
        @Html.DisplayNameFor(model => model.UserName)
        @Html.DisplayFor(model => model.UserName)
    </p>
    <p>
        @Html.DisplayNameFor(model => model.CreatedDate)
        @Html.DisplayFor(model => model.CreatedDate)
    </p>


</fieldset>
<p>
    @Html.ActionLink("刪除", "Delete",new { id=Model.PhotoID}) | 
    @Html.ActionLink("返回列表", "Index")
</p>

接著處理 creater view一樣的步驟 且帶model

差別在 create 有 form 用於上傳

直接用html5語意標籤簡單排版

然後用 simple binding 做資料傳遞處理

但是剛剛的東西拿掉 改為用

##@RAZOR Helper

@Html.BeginForm(actionname,controllername,formmether,new{enctype前端屬性}){}

@Html.AntiForgeryToken()

@Html.ValidationSummary()驗證通過不通過的管理器

@Html.LabelFor(model=>model.Title) 不用指定id name 但要

@Html.EditorFor()

@Html.ValidationMessageFor()

不能填就用displayfor即可

Using ???

避開 filter ? 資料庫重建 action req log ?

mvc model 獨立?

Controller怎樣都不會影響model???

@model PhotoSharing.Models.Photo

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@*<form method="post" action="/photos/create" enctype="multipart/form-data">*@

@using (Html.BeginForm("Create", "Photos", FormMethod.Post, new { enctype = "multipart/form-data" }))
        {
            @Html.AntiForgeryToken()
                    @Html.ValidationSummary()
    <p>
       @Html.LabelFor(model => model.Title)
                      @Html.EditorFor(model => model.Title)
                        @Html.ValidationMessageFor(model => model.Title)
    </p>
    <p>
        @Html.LabelFor(model => model.PhotoFile)
        <input id = "image" name = "image" type = "file" required />


           </p>


           <p>
               @Html.LabelFor(model => model.Description)
                        @Html.EditorFor(model => model.Description)
                        @Html.ValidationMessageFor(model => model.Description)
    </p>
    <p>
        @Html.LabelFor(model => model.UserName)
                        @Html.EditorFor(model => model.UserName)
                        @Html.ValidationMessageFor(model => model.UserName)
    </p>
    <p>
        @Html.LabelFor(model => model.CreatedDate)
                        @Html.DisplayFor(model => model.CreatedDate)

    </p>
    <p>
        <input id = "Submit1" type = "submit" value = "新增資料" class="btn btn-default" />
        @Html.ActionLink("返回列表", "Index")
    </p>
}


@*<p>
    <label>主題:</label>
    <input id="Title" name="Title" type="text" />
</p>
<p>
    <label>上傳照片:</label>
    <input id="image" name="image" type="text" />
</p>
<p>
    <label>描述:</label>
    <input id="Description" name="Description" type="text" />
</p>
<p>
    <label>發表人名稱:</label>
    <input id="UserName" name="UserName" type="text" />
</p>
<p>
    <label>建立日期:</label>
    <input id="CreatedDate" name="CreatedDate" type="text" />
</p>*@

@*</form>*@

@model PhotoSharing.Models.Photo

@{
    ViewBag.Title = "Delete";
}

<h2>Delete</h2>

<h3>Are you sure you want to delete this?</h3>
<div>
    <h4>Photo</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.Title)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Title)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.PhotoFile)
        </dt>

        <dd>
            @*//2.7-2 在Delete View(Delete.cshtml)使用GetImage Action*@
            @*@Html.DisplayFor(model => model.PhotoFile)*@
            <img class="img-responsive img-thumbnail" src="@Url.Action("GetImage","Photos",new { id=Model.PhotoID})" />
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.ImageMimeType)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.ImageMimeType)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Description)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Description)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.CreatedDate)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.CreatedDate)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.UserName)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.UserName)
        </dd>

    </dl>

    @using (Html.BeginForm()) {
        @Html.AntiForgeryToken()

        <div class="form-actions no-color">
            <input type="submit" value="Delete" class="btn btn-danger" /> |
            @Html.ActionLink("Back to List", "Index")
        </div>
    }
</div>

到此ok 到時會講趴修view

Previous2019/0603/Bootstrap Components RWD End + ASP.NET_MVC Part2 PhotoSharing CodeFirst & Model 驗證Next2019/0605/Java介面實作&結束+安卓工作室(整合Layout與Java)Intent意圖&Bundle包裹

Last updated 5 years ago

Was this helpful?

###

###

###

###

03_ActionFilter/PhotoSharing/Controllers/ValueReporter.cs
ftp://mvc@10.10.3.189/04_View/PhotoSharing/Views/Photos/Display.cshtml
ftp://mvc@10.10.3.189/04_View/PhotoSharing/Views/Photos/Create.cshtml
ftp://mvc@10.10.3.189/04_View/PhotoSharing/Views/Photos/Delete.cshtml
ADO.NETWikipedia
Entity FrameworkWikipedia
InputStream - Google SearchGoogle
Logo
Logo
Logo