ASP.NET MVC視圖助手、圖片驗證碼、郵箱驗證碼

一、視圖助手HTMLHelper

HTMLHelper-輔助視圖生成表單元素的工具類
頁面元素:連接、驗證、Form元素、其他
HtmlHelper的優勢

  1. 避免輸錯表單元素,提高開發效率
  2. 保持表單數據的狀態(更簡單的表單元素保持方法)
  3. 支持驗證

常見輸出表單方法

方法 對應的HTML
BeginForm(string actName,string conName ) < form/>
Hidden(string name) < input type=“Hidden”>
Password(string name) < input type=“Password”>
RadioButton(string name,object value) < input type=“radio”>
CheckBox(string name) < input type=“checkbox”>
TextBox(string name) < input type=“text”>
TextArea(string name) < textarea>
DropDownList(string name) < select>
ListBox(string name) < select multiple=“true”>
ActionLink(string linktext,sttring action) < a/>
ValidationMessage(string modelName) 輸出表單驗證信息
ValidationSummary() 輸出驗證彙總信息
Partial(string partialViewName) 輸出分部視圖(用戶控件)內容
  1. HTML輔助方法其實並不是直接從ViewBag的Model對象獲取模型數據,而是從ModelState對象獲取
  2. 如果用Model自動綁定,並使用了HTML輔助方法,爲了讓表單保持頁面提交的值,不需要傳遞數據值

二、MVC圖片驗證碼

1.Model文件下

public class CreateValidateCode
    {
        private string CreateRandomCode(int codeCount)
        {
            string code = "";
            Random r = new Random();
            //偶數給數字,奇數給小寫字母
            for (int i = 0; i < codeCount; i++)
            {
                //小寫字母和數字
                int type = r.Next(100);
                if (type % 2 == 0)
                {
                    code += r.Next(0, 10);
                }
                else
                {
                    code += (char)r.Next(97, 123);
                }
            }
            return code;
        }
        /// <summary>
        /// 生成驗證碼
        /// </summary>
        /// <param name="codeCount"></param>
        /// <returns></returns>
        public byte[] CreateValidateGraphic(int codeCount,out string content)
        {
            string code = CreateRandomCode(codeCount);
            content = code;
            //驗證碼圖片初始化
            Bitmap img = new Bitmap((int)Math.Ceiling(code.Length * 16.0), 27);
            Graphics g = Graphics.FromImage(img);
            try
            {
                Random r = new Random();
                g.Clear(Color.White);//清空背景
                //干擾線30條
                for (int i = 0; i < 30; i++)
                {
                    int x1 = r.Next(img.Width);
                    int y1 = r.Next(img.Height);
                    int x2 = r.Next(img.Width);
                    int y2 = r.Next(img.Height);
                    g.DrawLine(new Pen(Color.Silver),x1,y1,x2,y2);
                }
                Font font = new Font("Arial",13, (FontStyle.Bold| FontStyle.Italic));
                LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.Blue, Color.DarkRed, 0.25f, true);//設置畫刷
                g.DrawString(code, font, brush, 3, 3);
                //干擾點100個
                for (int i = 0; i < 100; i++)
                {
                    int x = r.Next(img.Width);
                    int y = r.Next(img.Height);
                    img.SetPixel(x,y,Color.FromArgb(r.Next()));
                }

                g.DrawRectangle(new Pen(Color.Black),0,0,img.Width-1,img.Height-1);
                //保存圖片
                MemoryStream stream = new MemoryStream();
                img.Save(stream, ImageFormat.Jpeg);
                return stream.ToArray();
            }
            finally
            {
                g.Dispose();
                img.Dispose();
            }
        }
    }

2.控制器實現

 //生成驗證碼圖片
        public ActionResult ValidateCode()
        {
            //1.生成一個隨機的4位驗證碼
            CreateValidateCode create = new CreateValidateCode();
            string code = "";
            //2.生成驗證碼並生成圖片文件的字節流
            byte[] arry = create.CreateValidateGraphic(4,out code);
            //3.將生成的驗證碼保存在TempData裏面,驗證碼在ASP.NET開發裏面都是通過Session保存的,所以用Session也行,用TempData也行
            TempData["VaildataCode"] = code;
            //4.返回驗證碼圖片
            return File(arry,"image/Jpeg");
        }

3.視圖顯示

 <tr>
                    <td>驗證碼:</td>
                    <td>
                    <input type="text" name="ValidateCode" value="@(Model==null?"":Model.ValidateCode)" />
                    <img src="@Url.Action("ValidateCode")" alt="驗證碼圖片" title="看不清?點擊更換"  οnclick="this.src = this.src+'?'"/>
                    </td>
                    <td>@Html.ValidationMessage("ValidateCode")
                    @Html.ValidationMessage("validata")</td>
                </tr>

三、郵箱驗證碼

1.Model文件夾

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.Net.Mail;//驗證功能命名空間

namespace EmailYanZhengDemo.Models
{
    public class CreateValidateCode
    {
        /// <summary>
        /// 生成隨機字符串
        /// </summary>
        /// <param name="codeCount"></param>
        /// <returns></returns>
        private string CreateRandomCode(int codeCount)
        {
            string code = "";
            Random r = new Random();
            //偶數給數字,奇數給小寫字母
            for (int i = 0; i < codeCount; i++)
            {
                //小寫字母和數字
                int type = r.Next(100);
                if (type % 2 == 0)
                {
                    code += r.Next(0, 10);
                }
                else
                {
                    code += (char)r.Next(97, 123);
                }
            }
            return code;
        }
        /// <summary>
        /// 郵箱隨機字符串
        /// </summary>
        /// <param name="codeCount"></param>
        /// <param name="content"></param>
        /// <param name="toMail"></param>
        /// <returns></returns>
        public bool EmailValidataCode(int codeCount, out string content, string toMail)
        {
            string code = CreateRandomCode(codeCount);
            content = code;
            try
            {
                MailMessage mail = new MailMessage();
                //發件人郵箱地址
                mail.From = new MailAddress("[email protected]");
                mail.To.Add(new MailAddress(toMail));
                mail.Subject = "【學員註冊驗證碼】";
                mail.Body = $"您本次註冊學員的驗證碼爲【{code}】,如未進行註冊操作請忽略!";
                //smtp郵件發送
                SmtpClient client = new SmtpClient();
                client.Host = " smtp.163.com";//主機ID
                client.EnableSsl = true;
                //授權碼在每次開啓郵箱的Smtp功能時自動生成的
                client.Credentials = new NetworkCredential("[email protected]", "SXNBZRMOUUIXVTMM");//授權碼使用開啓pop3獲取
                client.Send(mail);
                return true;
            }
            catch (Exception ex)
            {

                return false;
            }
        }
    }
}

2.控制器文件中

 		/// <summary>
        /// 郵箱驗證頁面
        /// </summary>
        /// <param name="Emailcode">需驗證的字符串</param>
        /// <returns></returns>
        public ActionResult EmailCode(string Emailcode)
        {
            if (Emailcode.Equals(TempData["codevalidata"]))
            {
                return Content("註冊成功!");
            }
            else
            {
                return View();
            }
        }
        /// <summary>
        /// 發送郵件(通過獲取Email參數爲郵箱ID)
        /// </summary>
        /// <returns></returns>
        public ActionResult SendEmail()
        {
            string Email = Request["Email"];
            CreateValidateCode validateCode = new CreateValidateCode();
            string code = "";
            if (validateCode.EmailValidataCode(6,out code,Email))
            {
                 TempData["codevalidata"] = code;
                // 郵件發送 成功,使用路由規則觸發控制器中的EmailCode動作方法
                return View("EmailCode");
            }
            else
            {
                //郵件發送失敗
                return JavaScript("alert('郵件發送失敗!請稍後再試!')");
            }
        }

HTMLHelper總結參考:https://www.cnblogs.com/JoeSnail/p/7724341.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章