作业八之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")" />