2019年8月26日 星期一

ASP.NET MVC - 編輯 (Edit) 與檔案上傳 (FileUpload)

微軟的 ASP.NET MVC範例,新增 (Create)有搭配檔案上傳


但沒有提供編輯 (Edit) 的功能
其實,以微軟提供的範例來說,這些功能都有了

"拼湊"都能做到您想要的功能。

詳見 9vs1.com線上課程 -  https://9vs1.com/go/?i=4db77e0bf891(課程優惠代碼 4BbKKha​ )

=========================================================
因為微軟改為ASP.NET Core版的MVC
https://github.com/MicrosoftLearning/20486-DevelopingASPNETMVCWebApplications

所以 原本範例 (PhotoSharing) 只能從網友留下的 "備份"去找
https://github.com/faiteo/Photo-Sharing-Application-using-Asp.Net-mvc-4-/tree/master/PhotoSharingApplication-2015/PhotoSharingApplication-2015

我手邊還有 MVC 4 與 MVC 5的版本,但內容大同小異。上面的範例就夠用了。

        public ActionResult Edit_NEW(int id = 0)
        {
            Photo photo = _db.Photos.Find(id);
            if (photo == null)
            {
                return HttpNotFound();  // 找不到
            }
            return View(photo);
        }



接下來的 Edit_NEW檢視畫面中,要將 Photo資料表裡面的二進位內容(放置圖片的欄位,資料型態為 VarBinary(MAX)),還原成「圖片檔」,

這段程式在 Details檢視畫面 就有
(上傳以後,把圖片存入資料表。
    所以,呈現圖片時,必須寫一段程式,把二進位內容,還原成圖片檔)

詳見 9vs1.com線上課程 -  https://9vs1.com/go/?i=4db77e0bf891(課程優惠代碼 4BbKKha​ )


@model PhotoSharingApplication.Models.Photo
@{
    Layout = null;
}

   
    @using (Html.BeginForm("Edit", "Photo", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        @Html.AntiForgeryToken()
        ................(後續省略)

   

Photo

   


    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @Html.HiddenFor(model => model.PhotoID)
   
    @if (Model.PhotoFile != null)
    {
       

            @Url.Action("GetImage", "Photo", new { Model.PhotoID })

" />
           
       
    }
   

   

        @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
       

            @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
       

   


   
   

        Upload new @Html.LabelFor(model => model.PhotoFile):
       

           
           
           
       

   

   

        @Html.LabelFor(model => model.Description, htmlAttributes: new { @class = "control-label col-md-2" })
       

            @Html.EditorFor(model => model.Description, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Description, "", new { @class = "text-danger" })
       

   

   
   

        @Html.LabelFor(model => model.CreatedDate, htmlAttributes: new { @class = "control-label col-md-2" })
       

            @Html.EditorFor(model => model.CreatedDate, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.CreatedDate, "", new { @class = "text-danger" })
       

   

   

        @Html.LabelFor(model => model.UserName, htmlAttributes: new { @class = "control-label col-md-2" })
       

            @Html.EditorFor(model => model.UserName, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.UserName, "", new { @class = "text-danger" })
       

   

   
   

        @Html.LabelFor(model => model.ModifiedDate, htmlAttributes: new { @class = "control-label col-md-2" })
       

            @Html.EditorFor(model => model.ModifiedDate, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.ModifiedDate, "", new { @class = "text-danger" })
       

   

   

       

           
       

   


    }   

        @Html.ActionLink("Back to List", "Index")
   





按下 Submit按鈕以後,交給下一個動作來處理

詳見 9vs1.com線上課程 -  https://9vs1.com/go/?i=4db77e0bf891(課程優惠代碼 4BbKKha​ )

=========================================================
        //
        // POST: /Photo/Edit/5 (原本範例沒有,這是我們額外增添的功能)
        [HttpPost]
        [ValidateAntiForgeryToken]   // 避免CSRF攻擊
        public ActionResult Edit(Photo _photo, HttpPostedFileBase image)
        {   //                                                                 ****************************
            if (ModelState.IsValid)              {  
                //*** 檔案上傳 ****************************************(start) 這段程式在 Create動作裡面也有
                if (image != null)
                {
                    _photo.ImageMimeType = image.ContentType;
                    _photo.PhotoFile = new byte[image.ContentLength];
                    image.InputStream.Read(_photo.PhotoFile, 0, image.ContentLength);
                }
                //*** 檔案上傳 ****************************************(end)
                // 第一種寫法:
                _db.Entry(_photo).State = System.Data.Entity.EntityState.Modified;  //確認被修改(狀態:Modified)
                _db.SaveChanges();
                //return Content(" 更新一筆記錄,成功!");    // 更新成功後,出現訊息(字串)。
                return RedirectToAction("Index");
            }
            else    {
                return Content(" *** 更新失敗!!*** ");
            }
         
        }

[學員感言] mis2000lab課程評價 - ASP.NET MVC , WebForm

https://www.dotblogs.com.tw/mis2000lab/2023/01/30/mis2000lab_MVC_onlineLearning2023

[ASP.NET Core MVC]第一天 免費課程 3小時完整試聽

https://www.dotblogs.com.tw/mis2000lab/2023/01/30/AspNetCore_MVC_First_Day_Free_20230130

從最早的 75小時MVC課程,目前已經延伸到 115小時,也包含了 .NET Core

.NET Core 6 MVC線上教學 - MIS2000Lab 課程大綱 與 試聽

https://dotblogs.com.tw/mis2000lab/2021/07/18/NET_MVC_Online_Free_Learning_mis2000lab 

購買完整MVC課程(一百小時),限時六折優惠並免費加贈兩萬元「.NET Core升級課程」,請直接來信洽詢

(太便宜!太划算,不能公開) mis2000lab (at) yahoo.com.tw ; school (at) mis2000lab.net

ASP.NET MVC - Login 會員登入與權限控管

課程介紹    https://9vs1.com/go/?i=3580aaf8f818

ASP NET MVC Login Authorization MIS2000Lab 1

任何商業系統都需要「會員登入與權限控管」的機制,因此不少初學者,或坊間教學只會用微軟提供的現成工具或套件,如 ASP.NET Identity 去作會員登入與權限管理,但在這套工具還沒出現以前,市面上這麼多網站的「會員登入」的機制又是打哪來的呢?如果不用現成套件又要如何去做呢?

本課程將教你多種會員登入的機制,不只是 ASP.NET Web Form 與 MVC 兩者都可共用,有很多方法甚至可以沿用到 PHP 、 JSP 等其他網頁程式上,學會網頁程式共用的技巧,這樣的學習才是聰明的投資,不會被綁在某一套程式語法上面,將來在面試、應徵工作時,也越能凸顯自己的能力。

ASP NET MVC Login Authorization MIS2000Lab title2
ASP NET MVC Login Authorization MIS2000Lab 2

除了會員登入與管理,本課程也提供幾種網路攻擊與資訊安全的防範之道。例如:資料隱碼攻擊(SQL Injection)、跨網站腳本攻擊(XSS)、跨網站冒名請求(CSRF)。當你知道別人怎麼攻擊,才能尋求解法,知道如何防範,真正做到「知己知彼,百戰百勝」。

課程中還會分享DLL類別庫專案的作法,把共用的程式抽離出來。

FormsAuthentication 與MVC的 [Authorize] 互相搭配,也可做到會員登入與控管的功能,不管是WebForm或是MVC都可以使用這方法。

最後更提供兩個實用的範例:
第一,以雜湊運算「單向」的打亂機密資訊。
第二,會員註冊以後,需要透過E-Mail再次確認身份,避免幽靈帳號大量註冊。

課程網址    https://9vs1.com/go/?i=3580aaf8f818

ASP NET MVC Login Authorization MIS2000Lab title3
ASP NET MVC Login Authorization MIS2000Lab 3

本課程的教法是循序漸進、由淺入深,每一節的進度都比上一節微幅增加,讓學員學習起來不會覺得壓力太大或是跟不上,還有持續進步的感覺。

主要教學方針則以「實務」與「範例解說」作為目標,不只可以透過大量的實作練習,直接以實戰練功,老師更會親自為學員示範常見的範例,與論壇上經常被人問到的功能。其中的範例與技巧,也都能同時用在 ASP.NET Web Form 與 MVC 上面,一魚兩吃,絕對超值!


ASP NET MVC Login Authorization MIS2000Lab title4

1.會員登入與權限控管

    很多初學者以為 ASP.NET MVC 「只能」透過 ASP.NET Identity 這種現成的工具與套件才能作會員登入與權限控管的機制。但事實上,有很多方法都可以做到,而且更簡單易懂。

2. 設計會員登入的資料表

    任何網頁程式與Web Server都支援「狀態管理」的特性。 學會這一招,不管是PHP、JSP、傳統ASP(Classic ASP)或是ASP.NET(WebForm與MVC)都可以使用。
    本課程將會解說:會員登入與管理會用到資料表的哪些欄位。讓您自己設計資料表,再來寫程式。從頭到尾都可以一手包辦。

3. 基本練習 -- 比對帳號與密碼& 狀態管理 (所有網頁程式都有的特性)

    學會上一節的觀念後,暫時"不"連結資料庫(DB First),帳號與密碼都固定123,這只是一個簡單的練習(後續才會有資料庫的範例,請慢慢來)。
    這個範例主要講解狀態管理(Session)的用法,如何應用在會員登入與權限控管上。簡單易懂,一聽就會。

4.綜合練習—撰寫DLL類別庫,將共用程式抽離出來

    改寫上一節的範例,把共用的程式抽離出來,另外寫在DLL類別庫的專案中。

5.觀念與解說
    前面的範例,檢查會員登入的機制,要寫在哪裡比較合適? 為什麼不再寫於/App_Code目錄底下?改用DLL檔的類別庫專案來做?

6. 綜合練習 -- 連結資料庫 + 狀態管理(Session)。 每個人的帳號與密碼都要進資料庫比對。

    結合前面兩節的成果,現在您可以做出一個完整的範例,以「範例」為主的教學,加上「逐步延伸」與「經驗累積」。
    這樣的會員登入範例,不管是PHP、JSP、傳統ASP(Classic ASP)或是ASP.NET(WebForm與MVC)都可以使用 。

7.資訊安全—常見的網路攻擊與 防範之道

    完成上面的練習之後,本節將會解釋幾種網路攻擊的模式與防範的方法,包含資料隱碼攻擊(SQL Injection)、跨網站腳本攻擊(XSS)、跨網站冒名請求(CSRF)。知道別人怎麼攻擊,才能尋求防範之道。

8.綜合練習—連結資料庫 + 狀態管理(Cookie)

    改寫前面的範例,經過微調就能做到。每一節的進度都比上一節微幅增加,讓學員學習起來不會感到太大的壓力。
    這樣的會員登入範例,不管是PHP、JSP、傳統ASP(Classic ASP)或是ASP.NET(WebForm與MVC)都可以使用 。

9. 基本練習 -- FormsAuthentication與[Authorize]

    FormsAuthentication 的範例與程式碼較長,我們先做一個 入門的,簡短的 版本,學會以後,再繼續深入下去。

10.綜合練習— FormsAuthentication與 [Authorize]

    本範例可以同時用在ASP.NET(WebForm與MVC)上面 ,學會一次終身受用!需要搭配Global.asax與Web.Config設定檔,一樣可以搭配MVC控制器,在動作上方的 [Authorize] 作法。

11.綜合練習—透過雜湊運算,打亂機密資料

    以單向的方式行雜湊運算(如MD5或SHA1)將會員的機密資料打亂,搭配會員登入的密碼檢驗。本課程以「務實」與「範例解說」兩大目標為主,提供您常見的範例與論壇上經常被人問到的功能,為您親自示範,本範例ASP.NET(WebForm與MVC)皆可使用。

12.綜合練習—註冊成功後,透過E-Mail再次確認身份

    會員第一次註冊以後,通常會透過E-Mail再次確認此人身份,避免幽靈帳號的入侵。該怎麼做到呢?本課程以「務實」與「範例解說」兩大目標為主,提供您常見的範例與論壇上經常被人問到的功能,為您親自示範,本範例ASP.NET(WebForm與MVC)皆可使用。

ASP NET MVC Login Authorization MIS2000Lab title5
  • 以實作優先:減少理論說明,大量練習範例,講求從做中學。
  • 錯誤學習法:透過錯誤的範例從中學習,並找出自己的盲點。

ASP NET MVC Login Authorization MIS2000Lab title6
ASP NET MVC Login Authorization MIS2000Lab 4
ASP NET MVC Login Authorization MIS2000Lab title7
  1. 會員登入與權限控管
  2. 設計會員登入的資料表 & 狀態管理
  3. 連結資料庫
  4. 綜合練習—撰寫DLL類別庫,將共用程式抽離出來
  5. 觀念與解說
  6. 綜合練習—連結資料庫 + 狀態管理(Session)
  7. 資訊安全—常見的網路攻擊與防範之道
  8. 綜合練習—連結資料庫 + 狀態管理(Cookie)
  9. 綜合練習— FormsAuthentication與 [Authorize](簡易版 + 進階版)
  10. 綜合練習—透過雜湊運算,打亂機密資料
  11. 綜合練習—註冊成功後,透過E-Mail再次確認身份

    完整課程介紹   https://9vs1.com/go/?i=3580aaf8f818

學員上課後會學到什麼或能做什麼

  • 透過網頁程式都有的「狀態管理」的Session與Cookie做出「會員登入與權限控管」的機制。
  • 學會DLL類別庫專案的作法,把共用的程式抽離出來。
  • 幾種網路攻擊與防範之道,例如:資料隱碼攻擊(SQL Injection)、跨網站腳本攻擊(XSS)、跨網站冒名請求(CSRF)。
  • 透過雜湊運算將機密資訊打亂。
  • 會員註冊以後,透過E-Mail在測確認身份,避免由幽靈帳號大量註冊。

學員上課前需具備哪些軟、硬體設備或常識

  • 基礎的 OOP(物件導向)程式設計能力,如:類別(class)。建議已完成「ASP.NET MVC 教學 - 由零開始的入門課」的學習。
  • 知道資料庫(DataBase)與簡單的 T-SQL 指令,如:CRUD。 課程所需軟體皆可免費下載。
  • Visual Studio 2015~2019或後續新版,請下載社群版(Community版)。
  • 建議使用 Windows 作業系統。因為 Visual Studio Code 與 Visual Studio for Mac 與教學畫面仍有差異。
  • SQL Server Express 版(免費)。建議使用 SQL Server 2012(Express版)或後續新版。

課程適合對象  

  • 本課程屬於進階課程,建議完成「ASP.NET MVC 教學 - 由零開始的入門課」課程後再來學習。
  • 需要撰寫網頁系統、或對於網頁與資料庫的開發有興趣的朋友。
  • 未來的程式設計師 -- 希望將來進入業界寫程式,開發網頁系統。
  • 曾寫過 ASP、ASP.NET(Web Form)、PHP、JSP 的朋友,現在想學習 ASP.NET MVC 5。

課程介紹    https://9vs1.com/go/?i=3580aaf8f818