


Classe de code de vérification
namespace QJW.VerifyCode { //用法: //public FileContentResult CreateValidate() //{ // ValidateCode vCode = new ValidateCode(); // string code = vCode.CreateValidateCode(5); // Session["ValidateCode"] = code; // byte[] bytes = vCode.CreateValidateGraphic(code); // return File(bytes, "image/JPEG"); //} public class ValidateCode { public ValidateCode() { } /// <summary> /// 驗(yàn)證碼的最大長度 /// </summary> public int MaxLength { get { return 10; } } /// <summary> /// 驗(yàn)證碼的最小長度 /// </summary> public int MinLength { get { return 1; } } /// <summary> /// 生成驗(yàn)證碼 /// </summary> /// <param name="length">指定驗(yàn)證碼的長度</param> /// <returns></returns> public string CreateValidateCode(int length) { int[] randMembers = new int[length]; int[] validateNums = new int[length]; string validateNumberStr = ""; //生成起始序列值 int seekSeek = unchecked((int)DateTime.Now.Ticks); Random seekRand = new Random(seekSeek); int beginSeek = (int)seekRand.Next(0, Int32.MaxValue - length * 10000); int[] seeks = new int[length]; for (int i = 0; i < length; i++) { beginSeek += 10000; seeks[i] = beginSeek; } //生成隨機(jī)數(shù)字 for (int i = 0; i < length; i++) { Random rand = new Random(seeks[i]); int pownum = 1 * (int)Math.Pow(10, length); randMembers[i] = rand.Next(pownum, Int32.MaxValue); } //抽取隨機(jī)數(shù)字 for (int i = 0; i < length; i++) { string numStr = randMembers[i].ToString(); int numLength = numStr.Length; Random rand = new Random(); int numPosition = rand.Next(0, numLength - 1); validateNums[i] = Int32.Parse(numStr.Substring(numPosition, 1)); } //生成驗(yàn)證碼 for (int i = 0; i < length; i++) { validateNumberStr += validateNums[i].ToString(); } return validateNumberStr; } /// <summary> /// 創(chuàng)建驗(yàn)證碼的圖片 /// </summary> /// <param name="containsPage">要輸出到的page對(duì)象</param> /// <param name="validateNum">驗(yàn)證碼</param> public byte[] CreateValidateGraphic(string validateCode) { Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 22); Graphics g = Graphics.FromImage(image); try { //生成隨機(jī)生成器 Random random = new Random(); //清空?qǐng)D片背景色 g.Clear(Color.White); //畫圖片的干擾線 for (int i = 0; i < 25; i++) { int x1 = random.Next(image.Width); int x2 = random.Next(image.Width); int y1 = random.Next(image.Height); int y2 = random.Next(image.Height); g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2); } Font font = new Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic)); LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true); g.DrawString(validateCode, font, brush, 3, 2); //畫圖片的前景干擾點(diǎn) for (int i = 0; i < 100; i++) { int x = random.Next(image.Width); int y = random.Next(image.Height); image.SetPixel(x, y, Color.FromArgb(random.Next())); } //畫圖片的邊框線 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); //保存圖片數(shù)據(jù) MemoryStream stream = new MemoryStream(); image.Save(stream, ImageFormat.Jpeg); //輸出圖片流 return stream.ToArray(); } finally { g.Dispose(); image.Dispose(); } } /// <summary> /// 得到驗(yàn)證碼圖片的長度 /// </summary> /// <param name="validateNumLength">驗(yàn)證碼的長度</param> /// <returns></returns> public static int GetImageWidth(int validateNumLength) { return (int)(validateNumLength * 12.0); } /// <summary> /// 得到驗(yàn)證碼的高度 /// </summary> /// <returns></returns> public static double GetImageHeight() { return 22.5; } } }
Utilisation
public FileContentResult CreateValidate() { ValidateCode vCode = new ValidateCode(); string code = vCode.CreateValidateCode(5); Session["ValidateCode"] = code; byte[] bytes = vCode.CreateValidateGraphic(code); return File(bytes, "image/JPEG"); }
function reloadcode() { var verify = document.getElementById('safecode'); verify.setAttribute('src', '/common/CreateValidate?' + Math.random()); }
Ce qui précède représente l'intégralité du contenu de cet article , J'espère que cela sera utile à l'apprentissage de tout le monde, et j'espère que tout le monde soutiendra le site Web PHP chinois.
Pour plus d'articles liés à l'utilisation de la classe de code de vérification asp.net mvc, veuillez faire attention au site Web PHP chinois?!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

TheyieldKeywordInc # SimplifieSiteratorCreationyByAutomAticygeneratingastateMArnEtHaTenablesLayEvaluation.1.itallowsreturningItemSonEatatimeusingyElDreturn, PausingExecutionbetweenEachItem, qui estsidéalforlargeordynynamicesences.yieldbreakCanbem, qui estsidéalforgargeordynamicSequences.yieldbreakCanbenem, qui estsidéal pour la réduction

DependencyInjection (DI) Inc # IsadesignPatterntHatenhancesmodularité, testabilité et responsabilité par la fa?on dont les dépenses de contr?le

Le r?le d'idisposable et de l'utilisation dans C # est de gérer efficacement et de manière déterministe des ressources non gérées. 1. IDisposable fournit la méthode Dispose (), afin que la classe puisse clairement définir comment libérer des ressources non gérées; 2. L'instruction d'utilisation garantit que Disser () est automatiquement appelé lorsque l'objet est hors de portée, simplifiant la gestion des ressources et évitant les fuites; 3. Lorsque vous l'utilisez, veuillez noter que l'objet doit implémenter iDisposable, peut déclarer plusieurs objets et utiliser toujours en utilisant pour des types tels que StreamReader; 4. Les meilleures pratiques courantes incluent ne pas s'appuyer sur les destructeurs pour nettoyer, gérer correctement les objets imbriqués et mettre en ?uvre le modèle de disposition (bool).

LambdaExpressionsandLinqsimpplifyDatamanipulationIn # byenablingConcise, lisible et efficacecode.1.LambdaExpressionsallowinlineFunctionDctiondfinitions, faisant en sorte que

NullableReferenceTypes (NRTS) Inc # 8 HelpCatchNullReferenceExceptionErrorSatCompileTimeByMakingreferenceTySnon NullableByDefault, obligeant la disposition de laclaration

Span et la mémoire améliorent les performances C # en réduisant l'allocation de mémoire. 1. Span évite la copie du tableau et fournit des références légères à la mémoire existante, ce qui convient aux protocoles binaires d'analyse, aux opérations de cha?ne et à la gestion des tampons haute performance; 2. La mémoire prend en charge le passage des tranches de mémoire sur les méthodes asynchrones, qui conviennent aux scénarios où des cycles de vie plus flexibles sont nécessaires; 3. Les deux réduisent la pression GC, optimisent les performances en réutilisant les tampons et en évitant la copie temporaire; 4. La portée est limitée à l'utilisation sur la pile et ne peut pas être stockée dans les classes ou utilisée dans des méthodes asynchrones. Soyez prudent pour éviter les opérations de réaffectation telles que Call.ToArray ().

Quatre problèmes "anti-motifs" courants dans le développement C # doivent être évités. Premièrement, l'utilisation déraisonnable d'Async / Await conduit à des impasses ou à une dégradation des performances. Nous devons adhérer au principe de l'asynchrone complète, configurer la configurationaWait (false) et standardiser la dénomination; Deuxièmement, une dépendance excessive à l'égard de la VAR affecte la lisibilité et déclare et unifie explicitement les spécifications de l'équipe lorsque le type n'est pas clair; Troisièmement, l'utilisation incorrecte de la gestion des dispositions et des ressources provoque des fuites, et l'instruction d'utilisation doit être utilisée correctement et le mode standard IDISPOSable doit être mis en ?uvre; Quatrièmement, l'abus des classes statiques ou des singletons provoque des difficultés de test, et la priorité devrait être accordée à l'injection de dépendance, à l'état sans état ou au cycle de vie géré par des conteneurs. éviter ces malentendus peut considérablement améliorer la qualité et la maintenance du code.

Le principe solide est cinq principes de conception pour améliorer la maintenabilité et l'évolutivité du code dans la programmation orientée objet. Ce sont: 1. Le principe de responsabilité unique (SRP) exige que la classe n'assume qu'une seule responsabilité, comme la séparation de la génération de rapports et l'envoi d'e-mails; 2. Le principe d'ouverture et de cl?ture (OCP) souligne que l'extension est prise en charge par des interfaces ou des classes abstraites sans modifier le code d'origine, comme l'utilisation de l'interface ishape pour réaliser le calcul de la zone de différents graphiques; 3. Le principe de remplacement de Richter (LSP) exige que la sous-classe puisse remplacer la classe parent sans détruire la logique, comme le carré ne doit pas hériter à tort du rectangle, entra?nant un comportement anormal; 4. Le principe d'isolement d'interface (ISP) préconise la définition des interfaces à grain fin, telles que les fonctions d'impression et de balayage divisées pour éviter les dépendances redondantes; 5. Le principe d'inversion de dépendance (DIP) préconise le
