網頁

C# Shallow Cpoy VS Deep Copy

淺層拷貝於深層拷貝差別 

有時需要拷貝物件時到底該怎樣視自己需要來做拷貝?
差別在於拷貝的class內部的參考物件是否只拷貝參考指標
或是拷貝完整獨立物件(連參考物件一起拷貝)
補充:
  • 序列化(Serialize)的意義是把物件變成類似binary的資料,通常用來做資料傳輸,例如網路的資料傳輸
  • 反序列化(DeSerialize)表示把類似binary的資料還原回物件狀態

三種色彩表達法 - RGB & HEX & ColorName

不知道大家有沒有這樣的經驗,在剛開始寫程式的時候,看到顏色就一陣頭痛,像我就得了看到#和rgb()就頭痛的病,懶惰如我這次終於受不了這種頭痛了,決定研究解藥來幫助和我一樣偏頭痛的人(?
廢話不多說,常見的有Color NameHEXRGB三種表達方式:

如何在關閉Outlook後自動隱藏至右下角? [ Minimize and Close Outlook to Taskbar ]

在公司使用Outlook時常常不小心按到X,Outlook就直接關掉了,這時候收到信就不會自動通知...非常麻煩,因此上網找了一下按關閉時收到右下角工具列以及縮小時自動隱藏到右下角的方法,在此分享給各位^^

C#檔案讀寫

filestream.Seek()設定資料流起始位置後,就可由此開始傳遞資料流(stream)
PS.原本是要寫檔案續傳的 ,結果變切圖測試 (?).....

C# Interface base rule 介面潛規則

Interface是C#裡相當重要的概念,它可以完成多型,讓我們方便維護,本篇整理寫介面時的基本規則,如下:
  1. Interface 會要求繼承的類別(class)必須實作interface裡面定義的方法,建議使用 I 開頭定義

Javascript function 的參數傳遞 [ function parameter ]

有寫過C#或JAVA的朋友一開始接觸 Javascript 是否和我一樣,覺得 Javascript funtion 傳遞的參數很奇怪呢?小弟困擾了很久,決定上w3school研讀一番,根據自己的理解整理如下:

C# 使用 SMTP 寄送 Email

依據要使用的Mail服務更改smtpAddress、portNumber以及enableSSL三個變數
主機名稱 SMTP Address Port SSL
Yahoo! smtp.mail.yahoo.com 587 True
GMail smtp.gmail.com 587 True
Hotmail smtp.live.com 587 True

Javascript 陣列觀念&相關方法 [Javascript Array]

重要觀念:Arrays 是一種特殊的 Objects

首先介紹Array的兩種宣告方式:
var cars = [];

var cars = new Arrary();

3分鐘內建立Azure WebSites

說到雲端服務,最基本的就是要學會快速用雲端服務建立自己的網站,今天就以圖片的方式告訴大家如何在三分鐘內建立Azure Websites吧!

JavaScript 封裝 [JavaScript Closure]


今天要介紹的是Javascript裡非常重要的概念 - "封裝(Closure)"
也就是和C#、JAVA等語言一樣,變數也會有Private、Public的差別!

Javascript Hoist

W3School Hoist解說參考

大家可能沒想過,為什麼在JavaScript中我們能在前面就叫用後來宣告的方法呢?
這是因為JavaScript中"Hoist"這個行為所產生的結果,今天就來和大家分享這個小知識吧!

"Hoist"中文翻做"提升",顧名思義,就是在Javascript中預設會自動將宣告的變數/方法提到最前面,因此先使用後來才宣告變數/方法是沒問題的,如下:

Javascript 中參數 this 的意義、呼叫function的三種方法

this 代表"擁有"這個 function 的 object
所以如果是放在最外層(就是什麼都沒有包)直接呼叫,那麼this就是window object這個物件了!可以參照如下所示,但是這個例子這樣做是不對的,因為隨意使用window object很容易讓整個程式當掉:

function myFunction() {
    return this;
}
myFunction();                // Will return the window object

Javascript String 相關方法 [Javascript String Method]

  • indexOf() 搜尋第一個符合的字,回傳index,若無則回傳-1
    var str = "Please locate where 'locate' occurs!";
    var pos = str.indexOf("locate");
  • lastIndexOf() 搜尋最後一個符合的字,回傳index,若無則回傳-1
  • search() 和 indexOf() 完全一樣

Sublime Text 3 安裝常見問題(Package Control手動安裝、"No packages available for installation"、安裝Emmet出現錯誤)

Sublime Text 3 是身為前端工程師必安裝的工具,在保哥Sublime Text 3 新手上路:必要的安裝、設定與基本使用教學 這篇中都介紹的很詳細,但是在公司安裝時,由於使用Proxy的關係常常會遇到一些問題,以下整理安裝方法及問題解決方式:

※請先至 Sublime Text 3 網頁選擇適合自己的版本下載安裝

安裝完後首先要做的是安裝最重要的Package Control
一般安裝方式為:

利用 SQL Compact Edition 免費建立擁有 DataBase 的 Azure Websites [ Azure Websites + Database for free ]

只有免費服務才使用的這個世代,如果只是一個Demo用的小型網站自然不想使用到雲端的SQL DB來做為DataBase (其實只是不想花一個月150左右的DB費用XD)

鑑於想要使用免費Azure Websites,但又想要連接資料庫的人要怎麼做呢?
只能每個月砸150台幣買DB了嗎!?

答案當然是NO!

Code First "Virtual" 的用處 // Understanding code first virtual properties

一開始在學習 Code First 時會發現 "virtual" 都放在 List<> 前面,而小弟也相當疑惑,於是查了資料之後整理如下:

HTML5 強大的新功能 data() data- 自定義屬性介紹

常常會看到程式碼裡面有 < a href="#" class ="RemoveLink"  data-id="myid ">

這是什麼呢?
是DOM物件上的自定義屬性,是HTML5才有的!

這有什麼好處呢?

Error: The SMTP server requires a secure connection or the client was not authenticated.

繼上次Sending Email這篇文章後,開始把網頁發佈上Azure,卻發現出錯了!
錯誤訊息為:

Error: The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required.


Amazon EC2、Web Server 建立流程 (Windows作業系統)

Amazon老師教學網址:https://gist.github.com/qrtt1/9110349

使用前請先到Amazon Web Service註冊,輸入信用卡(一定要有),電話認證後取得帳號資格,若只是想試用記得選免費的,一樣要輸入信用卡但不會扣錢!
註:郵局VISA需開通海外轉帳才能用

Amazon EC2 服務介紹:

JavaScript 擷取字串 match( ) substring( ) indexOf( )

寫網頁有時候只需要用到JavaScript來擷取部分字串,就需要用到以下兩種字串截取的方法了!

先給一個範例:
有一串陣列  其中若某字串有wecare 字樣,如ddwecare
用for迴圈讀到ddwecare時,只要取 dd 時怎麼做呢?

MVC_Login // Login 全圖片教學

今天目的是教大家以ASP.NET MVC的架構實作登入畫面和驗證,以Model→Controller→View的方式來建構。

Step1:建立Model(命名:MyUsersModel)


Base64String 轉 byte[] 陣列的方法//Base64String to byte arrary

平常前端用Handler接Post過來的圖片時,會是Base64String格式,通常會需要轉byte[]陣列再做其他資料存取之類的動作,這時候就需要轉byte[ ] 的方法了..


以下提供兩種方式解決Base64String轉成byte[]的方法




第一種方法: Convert.FromBase64String( )


上面可以看到Base64String前面會有一堆用不到的字

造成執行Convert.FromBase64String(file)這個方法後直接跳出而且不會產生錯誤訊息....

讓你完全摸不著頭緒!!


解決辦法:

分割Base64string的前面那串字,因為那串字後面有一個逗號,故可以用split分離,可行但不好用

byte[] fileData = null;
file = file.Split(',')[1];
fileData= Convert.FromBase64String(file);

轉byte[ ]成功!!



第二種方法:System.Text.Encoding.ASCII.GetBytes( )

byte[] fileData = null;
fileData= System.Text.Encoding.ASCII.GetBytes(file);
 
不用做任何動作就轉完了!! 不知道為什麼微軟網頁推薦上面那種方法,又不報錯....


End

MVC_基本執行架構設定、流程

流程:

一、MVC架構會以路由(Route)裡的設定 new一個設定中的controller
       (這裡是HomeController)
二、呼叫設定裡同名的action,接著Index()回傳view() 也就是同名的  
        index.cshtml,最後將結果顯示到畫面上

也就是HomeController => Action(Index()) => 回傳View()

路由(Route): 其實在設定一開始的網址 (http://localhost:XXXX/Home/index)

APP_start/RouteConfig.cs

 public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}" );
                    //忽略.axd的檔案的意思

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new {  //這裡設定預設controller & View
                         controller = "Home"
                         action = "Index" 
                         id = UrlParameter .Optional }   
            );
        }
    }

Controllers/HomeController.cs

public ActionResult Index()    //Index對應到 Views/Index.cshtml
{
     return view();   =Views/Index.cshtml
}



C# 破圖問題 (flicker) 之解決辦法

最近寫C#視窗應用程式時遇到了破圖的問題,也就是所謂的Flicker,原因在於我專案中的自訂控制項,是由多個自訂控制項所組成的,造成Visual Studio來不及繪製好控制項,就將圖像提前呈現出來。
我的範例中的破圖情況,實際上只有一個控制項,卻有還沒放大前的殘像

試過了調整visible、拖慢顯示時間等等方法都沒用,最後終於找到解決方法了!詳細程式碼如下:

方法一、
在表單中複寫CreateParams方法:
protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                // Turn on WS_EX_COMPOSITED
                cp.ExStyle |= 0x02000000;  
                
                return cp;
            }
        }

方法二、
緩衝區延長
this.DoubleBuffered = true;
this.WindowState = FormWindowState.Maximized;

希望能幫助到大家!

C# Sending Email (error: 5.5.1 Authentication Required.)

今天在做自動發送EMail給客戶的程式碰到了一個問題:


出現錯誤:SMTP 伺服器需要安全連接,或用戶端未經驗證。 伺服器回應為: 5.5.1 Authentication Required. 


上網找了一陣子發現是gmail權限預設不能讓不明程式發送EMAIL,因此需要到google設定自己的電子郵件允許一般應用程式使用,也就是下圖最下面那排要啟用!!

啟用方法:

登入你的Google後→至Google帳號設定頁面→安全性較低的應用程式存取權限→啟用




看到已啟用後再試一次發送EMAIL就不會出錯了!
希望有幫助到各位!

附上非同步寄送Email的程式碼,如下:

 async public Task<string> SendEmailAsync(string Email) 
        {                  
            string emailFrom = "email@yahoo.com"; //你的email
            string password = "password";
            string emailTo = Email;  //"someone@domain.com";
            string subject = "Hello";
            string body = "Hello, I'm just writing this to say Hi!";
            using (MailMessage mail = new MailMessage())
            {
                mail.From = new MailAddress(emailFrom);
                mail.To.Add(emailTo);
                mail.Subject = subject;
                mail.Body = body;
                mail.IsBodyHtml = false;
                // 設true的話body可用HTML語法
                //mail.Attachments.Add(new Attachment("C:\\SomeFile.txt"));  //附件
               
                using (SmtpClient smtp = new SmtpClient())
                {
                    smtp.Host = "smtp.gmail.com";
                    smtp.Port = 587;
                    smtp.UseDefaultCredentials = false;
                    smtp.Credentials = new NetworkCredential(emailFrom, password);
                    smtp.EnableSsl = true;
                    try { await smtp.SendMailAsync(mail); }
                    catch { return " 的EMail位址不存在"; }
                }
                return "提醒EMail已發送!";
            }           
        }   
呼叫:
async private void BtnSendEmail_Click(object sender, EventArgs e)
{
       string result="";
       sting Email="someone@gmail.com";  
       result = await RemindHelper.SendEmailAsync(Email);
       Label1.Text = result;
}


UnitTest單元測試入門


UnitTest單元測試可以用來做白箱測試(意即自己寫Code測試),設定好入口和出口,看看執行結果是否正確,今天稍微摸了一下,紀錄入門筆記供以後參照。

預測試的程式碼: Index()
在執行前看看是否程式是導向到Views/Home/Index.cshtml頁面


今天要在執行之前做單元測試來看看是否導向到正確的位址



兩種套件處理方式:

一、使用微軟的:

1.建新專案(Test裡的單元測試專案)
2.安裝ASP.NET MVC套件
3.程式碼如下(建立一個HomeController物件,使用Index方法,看是否導到了Index頁面)
4.測試



二、使用xUnit套件:

1.建新專案(Test裡的單元測試專案)
2.安裝該專案的NuGet....
(1)xUnit套件
(2)ASP.NET MVC套件
3.安裝擴充套件裡的xUnit Runner


4.將要測試的專案加入參考並建置
5.測試程式碼如下( 標籤要改成[Fact] ),這是在測試打開的View是否為Index
6.接著打開測試→視窗→測試總管
7.執行測試!!  (左邊Run All 或是 按 Run Test After Build後Build) 



MVC_Entity FrameWork_Code First 實作教學_1

Hint:
  • Code First-指寫完程式碼自動生成DB(這個動作稱為Mapping,好像水反射一樣的那種感覺,Code反射到DB) ,另外做好DB產生程式碼也叫code first喔!! 不叫DB First很奇怪吧XD
  • 進入LocalDB只要在伺服器名稱打:(localdb)\V11.0  選window驗證即可進入

正題開始 Entity FrameWork

※先安裝NuGet套件→Entity FrameWork,並新增一個空白MVC架構的專案
※以下範例Code First結果皆產生到LocalDB資料庫


1.在Model內新增DBContext(選ADO實體資料集 也就是Entity FrameWork啦)
2.輸入想要建立的資料表,如下:




資料表內欄位如下(ClsOrder):
  • [ForeignKey("CustomerID")]標籤指定ForeignKey (其實可以不指定,預設會找後面有ID的屬性當FK)
  • public virtual ClsCustomer Customer { get; set; } 表示關連到ClsCustomer
  • [Required]指定必填欄位


資料表內欄位如下(ClsCustomer):
  • 注意!! private 或是 get set 裡面有輸入程式碼的又或是 [NotMapped] 標籤都不會 Mapping(映射)成資料欄位!!!
  • 建立OrderList以儲存客戶的Order資料,並利用建構子先New一個,免得到時候還要建List會忘記


最後在HomeController輸入程式碼並加入資料,F5執行後即完成Code First Mapping到資料庫的動作了!!

詳細如下: