網頁

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到資料庫的動作了!!

詳細如下: