作业八之MVC实例应用模式

六个基本质量属性为可用性、易用性、可修改性、可测试性、安全性、性能

其中可修改性在MVC中尤为体现,MVC是模型-视图-控制器的缩写,MVC设计模式的思想就是把Web应用程序分为3个核心模块:模型(Model)、视图(View)和控制器(Controller)。这三个模块分别充当不同的角色,完成不同的任务。它们之间彼此又相互联系,构成一个结构分明而又高效的整体。对代码进行修改变得方便,在修改对数据库相关操作的同时也无需对界面进行改动。

利用MVC模式多产生一些类,来提高程序的可读性与健壮性,单元测试更加方便,提高了可测试性。

MVC模式下,对不同角色分配不同权限,普通用户和管理员操作不同,提高了安全性。

分析MVC设计模式在具体网站中的应用

我们以新浪微博为例,可以用账号登录,同时也可以扫描二维码登录,密码可能会记不住,因此二维码有很大的应用场景。

下面是一个MVC中使用QrCodeNET生成二维码的一个例子

QrCode.NET是一个使用C#编写的用于生成二维码图片的类库,使用它可以非常方便的为WinForm等应用程序提供二维码编码输出功能。可以将二维码文件导出为eps格式。

Model

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using Gma.QrCodeNet.Encoding;
using Gma.QrCodeNet.Encoding.Windows.Render;

namespace QRCodeDemo
{
    public class QRCodeHelper
    {
        /// <summary>  
        /// 生成二维码  
        /// </summary>  
        /// <param name="content">内容</param>
        /// <param name="moduleSize">二维码的大小</param>
        /// <returns>输出流</returns>  
        public static MemoryStream GetQRCode(string content, int moduleSize = 9)
        {
            //ErrorCorrectionLevel 误差校正水平
            //QuietZoneModules     空白区域

            var encoder = new QrEncoder(ErrorCorrectionLevel.M);
            QrCode qrCode = encoder.Encode(content);
            GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(moduleSize, QuietZoneModules.Two) , Brushes.Black, Brushes.White);

            MemoryStream memoryStream = new MemoryStream();
            render.WriteToStream(qrCode.Matrix, ImageFormat.Jpeg, memoryStream);
            
            return memoryStream;

            //生成图片的代码
            //DrawingSize dSize = render.SizeCalculator.GetSize(qrCode.Matrix.Width);
            //Bitmap map = new Bitmap(dSize.CodeWidth, dSize.CodeWidth);
            //Graphics g = Graphics.FromImage(map);
            //render.Draw(g, qrCode.Matrix);
            //map.Save(fileName, ImageFormat.Jpeg);//fileName为存放的图片路径
        }

        /// <summary>
        /// 生成带Logo二维码  
        /// </summary>
        /// <param name="content">内容</param>
        /// <param name="iconPath">logo路径</param>
        /// <param name="moduleSize">二维码的大小</param>
        /// <returns>输出流</returns>
        public static MemoryStream GetQRCode(string content, string iconPath, int moduleSize = 9)
        {
            QrEncoder qrEncoder = new QrEncoder(ErrorCorrectionLevel.M);
            QrCode qrCode = qrEncoder.Encode(content);
            
            GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(moduleSize, QuietZoneModules.Two), Brushes.Black, Brushes.White);

            DrawingSize dSize = render.SizeCalculator.GetSize(qrCode.Matrix.Width);
            Bitmap map = new Bitmap(dSize.CodeWidth, dSize.CodeWidth);
            Graphics g = Graphics.FromImage(map);
            render.Draw(g, qrCode.Matrix);

            //追加Logo图片 ,注意控制Logo图片大小和二维码大小的比例
            //PS:追加的图片过大超过二维码的容错率会导致信息丢失,无法被识别
            Image img = Image.FromFile(iconPath);

            Point imgPoint = new Point((map.Width - img.Width) / 2, (map.Height - img.Height) / 2);
            g.DrawImage(img, imgPoint.X, imgPoint.Y, img.Width, img.Height);

            MemoryStream memoryStream = new MemoryStream();
            map.Save(memoryStream, ImageFormat.Jpeg);

            return memoryStream;

            //生成图片的代码: map.Save(fileName, ImageFormat.Jpeg);//fileName为存放的图片路径
        }
    }
}

Controller

public ActionResult CreateQrCode()
 {
       string str = "http://cn.bing.com/search?q=C%23";
       using (var memoryStream = QRCodeHelper.GetQRCode(str))
       {
             Response.ContentType = "image/jpeg";
             Response.OutputStream.Write(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
             Response.End();
       }
       return null;
}

View

<img id="qrcode" src="@Url.Action("CreateQrCode")"  />

 

posted on 2017-05-04 21:23  九块九毛九  阅读(329)  评论(0编辑  收藏  举报