zoukankan      html  css  js  c++  java
  • 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(4)对前面的一些问题汇总和总结

    索引

    【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目 目录索引

    简述

    今天我们对前3章的问题总个汇总,对一些东西做个简单的总结,相比大家到第3章发现编辑器报了很多错误了,不要担心 那是正常的,因为有很多类库我还没有发布。

    项目准备

    我们用的工具是:VS 2013 + SqlServer 2012 + IIS7.5

    希望大家对ASP.NET MVC有一个初步的理解,理论性的东西我们不做过多解释,有些地方不理解也没关系,会用就行了,用的多了,用的久了,自然就理解了。

    项目开始

    一、我们首先公布一些第3章用到的类库(无私奉献了~~~)

    第一个 CryptHelper呢,下面这个类我没有改类名字,其实这里用的是AES加密算法,这个在 【C#公共帮助类】给大家分享一些加密算法 (DES、HashCode、RSA、AES等) 里能找到,我在这再贴一下这个加密算法的代码

      1 using System;
      2 using System.Collections.Generic;
      3 using System.IO;
      4 using System.Linq;
      5 using System.Security.Cryptography;
      6 using System.Text;
      7 
      8 namespace Common.CryptHelper
      9 {
     10     public class DESCrypt
     11     {
     12        public const string RET_ERROR = "x07x07x07x07x07";
     13        private byte[] _IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
     14        private byte[] _Key = { 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 };
     15        private const string CRYPTO_KEY = "WKMVCYUANGANG";
     16        private int CRYPTO_KEY_LENGTH = 32;
     17   
     18        private AesCryptoServiceProvider m_aesCryptoServiceProvider;
     19        private string m_message;
     20        public string Message
     21        {
     22            get { return m_message; }
     23            set { m_message = value; }
     24        }
     25        private bool m_containKey;
     26        /// <summary>
     27        /// True:密文中包含密钥
     28        /// False:密文中不包含密钥
     29        /// </summary>
     30        public bool ContainKey
     31        {
     32            get { return m_containKey; }
     33            set { m_containKey = value; }
     34        }
     35        public DESCrypt()
     36        {
     37            m_aesCryptoServiceProvider = new AesCryptoServiceProvider();
     38            m_containKey = true;
     39            m_message = string.Empty;
     40        }
     41        public DESCrypt(bool containKey)
     42            : this()
     43        {
     44            m_containKey = containKey;
     45        }
     46        private string Encrypt(string s_crypto, byte[] key)
     47        {
     48            string s_encryped = string.Empty;
     49            byte[] crypto, encrypted;
     50            ICryptoTransform ct;
     51   
     52            try
     53            {
     54                crypto = string2Byte(s_crypto);
     55                m_aesCryptoServiceProvider.Key = key;
     56                m_aesCryptoServiceProvider.IV = _IV;
     57                ct = m_aesCryptoServiceProvider.CreateEncryptor();
     58                encrypted = ct.TransformFinalBlock(crypto, 0, crypto.Length);
     59                if (m_containKey)
     60                {
     61                    s_encryped += byte2HexString(key);
     62                }
     63                s_encryped += byte2HexString(encrypted);
     64                return s_encryped;
     65            }
     66            catch (Exception ex)
     67            {
     68                m_message = ex.ToString();
     69                return RET_ERROR;
     70            }
     71        }
     72        /// <summary>
     73        /// 指定密钥对明文进行AES加密
     74        /// </summary>
     75        /// <param name="s_crypto">明文</param>
     76        /// <param name="s_key">加密密钥</param>
     77        /// <returns></returns>
     78        public string Encrypt(string s_crypto, string s_key)
     79        {
     80            byte[] key = new byte[CRYPTO_KEY_LENGTH];
     81   
     82            byte[] temp = string2Byte(s_key);
     83            if (temp.Length > key.Length)
     84            {
     85                m_message = "Key too long,need less than 32 Bytes key.";
     86                return RET_ERROR;
     87            }
     88            key = string2Byte(s_key.PadRight(key.Length));
     89            return Encrypt(s_crypto, key);
     90        }
     91        /// <summary>
     92        /// 动态生成密钥,并对明文进行AES加密
     93        /// </summary>
     94        /// <param name="s_crypto">明文</param>
     95        /// <returns></returns>
     96        public string Encrypt(string s_crypto)
     97        {
     98            byte[] key = new byte[CRYPTO_KEY_LENGTH];
     99   
    100            m_aesCryptoServiceProvider.GenerateKey();
    101            key = m_aesCryptoServiceProvider.Key;
    102            return Encrypt(s_crypto, key);
    103        }
    104   
    105        private string Decrypt(string s_encrypted, byte[] key)
    106        {
    107            string s_decrypted = string.Empty;
    108            byte[] encrypted, decrypted;
    109            ICryptoTransform ct;
    110   
    111            try
    112            {
    113                encrypted = hexString2Byte(s_encrypted);
    114                m_aesCryptoServiceProvider.Key = key;
    115                m_aesCryptoServiceProvider.IV = _IV;
    116                ct = m_aesCryptoServiceProvider.CreateDecryptor();
    117                decrypted = ct.TransformFinalBlock(encrypted, 0, encrypted.Length);
    118                s_decrypted += byte2String(decrypted);
    119                return s_decrypted;
    120            }
    121            catch (Exception ex)
    122            {
    123                m_message = ex.ToString();
    124                m_message = "Decrypt fail.";
    125                return RET_ERROR;
    126            }
    127        }
    128        /// <summary>
    129        /// 从密文中解析出密钥,并对密文进行解密
    130        /// </summary>
    131        /// <param name="s_encrypted">密文</param>
    132        /// <returns></returns>
    133        public string Decrypt(string s_encrypted)
    134        {
    135            string s_key = string.Empty;
    136            byte[] key = new byte[CRYPTO_KEY_LENGTH];
    137   
    138            if (s_encrypted.Length <= CRYPTO_KEY_LENGTH * 2)
    139            {
    140                m_message = "Encrypted string invalid.";
    141                return RET_ERROR;
    142            }
    143            if (m_containKey)
    144            {
    145                s_key = s_encrypted.Substring(0, CRYPTO_KEY_LENGTH * 2);
    146                s_encrypted = s_encrypted.Substring(CRYPTO_KEY_LENGTH * 2);
    147            }
    148            key = hexString2Byte(s_key);
    149            return Decrypt(s_encrypted, key);
    150        }
    151        /// <summary>
    152        /// 指定密钥,并对密文进行解密
    153        /// </summary>
    154        /// <param name="s_encrypted">密文</param>
    155        /// <param name="s_key">密钥</param>
    156        /// <returns></returns>
    157        public string Decrypt(string s_encrypted, string s_key)
    158        {
    159            byte[] key = new byte[CRYPTO_KEY_LENGTH];
    160   
    161            byte[] temp = string2Byte(s_key);
    162            if (temp.Length > key.Length)
    163            {
    164                m_message = "Key invalid.too long,need less than 32 Bytes";
    165                return RET_ERROR;
    166            }
    167            key = string2Byte(s_key.PadRight(key.Length));
    168            if (m_containKey)
    169            {
    170                s_encrypted = s_encrypted.Substring(CRYPTO_KEY_LENGTH * 2);
    171            }
    172            return Decrypt(s_encrypted, key);
    173        }
    174 
    175        #region 私有方法
    176        private string byte2HexString(byte[] bytes)
    177        {
    178            StringBuilder sb = new StringBuilder();
    179            foreach (byte b in bytes)
    180            {
    181                sb.AppendFormat("{0:X2}", b);
    182            }
    183            return sb.ToString();
    184        }
    185        private byte[] hexString2Byte(string hex)
    186        {
    187            int len = hex.Length / 2;
    188            byte[] bytes = new byte[len];
    189            for (int i = 0; i < len; i++)
    190            {
    191                bytes[i] = (byte)(Convert.ToInt32(hex.Substring(i * 2, 2), 16));
    192            }
    193            return bytes;
    194        }
    195        private byte[] string2Byte(string str)
    196        {
    197            return Encoding.UTF8.GetBytes(str);
    198        }
    199        private string byte2String(byte[] bytes)
    200        {
    201            return Encoding.UTF8.GetString(bytes);
    202        }
    203        #endregion
    204 
    205     
    206     }
    207 }
    View Code

    第二个 Enums是个枚举类 【C#公共帮助类】枚举独特类

    第三个 JsonHelper 【C#公共帮助类】JsonHelper 操作帮助类, 以后再也不用满地找Json了,拿来直接用

    第四个 ToolsHelper  这个暂时用到了两个类 【C#公共帮助类】 ToolsHelper帮助类

    PageCollection.cs 我们在上一章已经讲过了,没有看到的朋友移步 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(3)公共基础数据操作类 RepositoryBase

    然后是 系统帮助类 Utils  【C#公共帮助类】 Utils 10年代码,最全的系统帮助类

    添加上这些类库之后,重新生成一下解决方案,哇哦~是不是一个错误都没有了~~当然类库 不只这些,我会逐步添加完善的~~

    二、我们对一些网友的问题 做一下汇总和总结

    首先我们总结一下:

    第(1)章

    我们就是创建了一个MVC项目,然后添加了两个区域,添加的这两个区域是干什么用的,在第(1)章已经解释了,在后面用到的时候大家也会一目了然。那么区域是什么?干什么用的?

    MVC框架支持组织一个web应用程序到的区域,以协助你在架构较为大型的项目,让独立性较高的部分功能独立成一个MVC子网站,以降低网站与网站之间的耦合性,也可以通过区域的切割,让多人同时开发同一个项目时候,能够减少互相冲突的机会。这在一个大的项目是非常有用的,如果所有的控制器、视图和模型都在一套MVC文件夹里,会是整个项目变得结构非常不清晰,并且难以管理。每个MVC区域是有自己的文件夹结构,允许您分开管理。这使得它更显而易见哪个项目元素相 互关联应用程序的功能区域,这有助于多个开发人员同事处理项目而没有彼此胡想不干扰。区域是支持主要通过路由机制。而在我们这个项目中,我们新建了两个区域,通俗的来讲 WebPage下的Controllers、Views我们是希望他们运行网站前台用户的,而Areas我们希望是管理后台系统,在简单来说,WebPage下的登录是网站用户用的,Areas下的登录是管理员用的。

    第(2)章

    这一章,我们主要就是创建了个简单的用户表(管理员表),然后添加了一个ADO.NET实体数据模型。

    第(3)章

    这一章我们主要是用到接口,因为我们整套系统是面向接口开发的,所以对接口不熟悉的朋友可以去研究一下接口,我们后面会用到很多很多的接口。

    这里呢,我把第(3)章中简单一解释接口的那段复制过来,如果还是不够清晰,请大家移步百度(话说百度搜索最近貌似有点问题),或者请比较熟悉的网友互相解释一下。

    接口是个规范,是不需要方法体的,说的通俗点,有了接口如果被继承肯定会有实现,这里你只需要写方法就行了,具体的方法是如何实现的我们不管,爱怎么实现怎么实现,我只是告诉你,你要是继承我这个接口,那么我这些方法你必须实现,而且要符合我规范。这就跟领导一条批示:你给我做个上传图片的方法,返回上传成功或失败。领导就是接口,你是实现类,你在这个领导下面干活,就相当于你继承了领导,那么你必须要完成这个图片上传方法并且返回上传结果,至于你是用网上的上传方法呀还是自己写个webservice啊还是用jquery插件啊随你,领导不关心你用什么,他只关心你按照他的要求去实现这个方法。

    对大家想说的一些话:

    评论呢,我基本是挨着看的,不说100%(时间不饶人),基本都给大家回复了,首先呢,我感谢大家这么支持和关注,这是对我的鼓励,也是我的动力。

          写这个系列的原因其实好简单,我也是个新手或者说刚刚脱离了新手,我们学习的时候呢,基本都是东拼西凑的,用到什么百度什么,看完这个看那个,也可能找到一些比较乐意分享的朋友的一些案例,但是第一,有些看不懂,第二,看起来很吃力。没有也没人愿意带我们一步一步做个项目,既能接收新的知识,又能对学过的做一些总结和深入。而且,好多人都不太乐意分享“自己感觉很好的技术”,这也不奇怪,谁都不想把劳动成果白白奉献,可是....博主就是这么一个喜欢“装B”的人,既然是“装B”,那么就要付出代价的,代价就是毫无保留的奉献自己的技术。(此处应该有掌声)本人不是什么大神,当然不自谦的说也不是个新手,现在5.1之后有午休时间,就利用午休时间带领大家从0开始做一个项目。收到了很多大家的支持和鼓励,这让我很欣慰,也很骄傲,同时呢,博文被一些网站抓取,有的甚至去掉了博主版权,这让人很愤慨,不过不影响继续对大家的分享,如果大家感觉写的可以,对你有所帮助,希望大家点一下推荐,如果大家感觉就是个水贴,请反对,不要客气,再次对大家表示感谢。

    正事,汇总一下问题:

    其实呢,评论不少,但是问题不是很多(因为还没讲多少东西),有些多次重复的问题呢,虽然我挨个回复了,我再统一解释一下。

    (1):VS、SQL、IIS版本的问题,可能我用的版本不是很高,可能你觉得像要最新的,不想看过时的东西,这里统一说一下,我用的基本就是主流的,没有用过时的东西,因为这一系列是我现做现发布的,不是拿以前的东西来充数的。

    VS(2013)的版本问题: 我考虑过 我咨询了很多技术群的朋友 现在大部分都是2013 也有2008的不过很少 因为是向下兼容的 所以更高的版本我们不考虑,而2012也是没问题的,至于2008我没试过 也不好说
    SQL(2012)的版本: 这个问题不大 我都是贴出T-SQL 直接执行一下就行了 方便移植的
    IIS6: 因为我本机是win7我用的IIS6 在服务器上是IIS7.5 也是没问题的  我的错,我用的是IIS7.5,第一篇博客是笔记本写的,笔记本是II6 后面的这段就复制了 再次感谢 @ 菜菜灰

    (2):Service类库添加引用找不到EntityFramework和EntityFramework.SqlServer

    告诉你个简单的方法吧,具体正常怎么去添加,我就先不解释了 你看你的Domain类库下面 肯定有着两个引用是吧 你直接添加引用 浏览 找到Domain类库的这两个dll引用进来就好了

    其它,还没发现什么特别的问题,至于第(3)章报错的问题,上面已经发布了需要的类库了

    在这。。。提一下,在这个项目过程中不提供Demo下载是为了让大家边学边做,拿来主义是没有意义的,不过每一章的Demo我都打过包了,在项目结束后,我会提供各个阶段的Demo下载。

    原创文章 转载请尊重劳动成果 http://yuangang.cnblogs.com

  • 相关阅读:
    geoserver发布地图服务WMTS
    geoserver发布地图服务WMS
    geoserver安装部署步骤
    arcgis api 3.x for js 入门开发系列十四最近设施点路径分析(附源码下载)
    arcgis api 3.x for js 入门开发系列十三地图最短路径分析(附源码下载)
    cesium 之自定义气泡窗口 infoWindow 后续优化篇(附源码下载)
    arcgis api 3.x for js 入门开发系列十二地图打印GP服务(附源码下载)
    arcgis api 3.x for js 入门开发系列十一地图统计图(附源码下载)
    arcgis api 3.x for js 入门开发系列十叠加 SHP 图层(附源码下载)
    arcgis api 3.x for js入门开发系列九热力图效果(附源码下载)
  • 原文地址:https://www.cnblogs.com/yuangang/p/5478173.html
Copyright © 2011-2022 走看看