你的位置:首页 > ASP.net教程

[ASP.net教程]【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.2) 登录功能的实现,接口注入、log4net的使用


声明:本系列为原创,分享本人现用框架,未经本人同意,禁止转载!http://yuangang.cnblogs.com

希望大家好好一步一步做,所有的技术和项目,都毫无保留的提供,希望大家能自己跟着做一套,还有,请大家放心,只要大家喜欢,有人需要,绝对不会烂尾,我会坚持写完~

如果你感觉文章有帮助,点一下推荐,让更多的朋友参与进来,也是对本人劳动成果的鼓励,谢谢大家!由于还要工作,所以基本都是牺牲午休时间来写博客的,写博客呢不是简单的Ctrl+C、Ctrl+V,我是要挨着做一遍的,这也是对大家负责,所以有些时候更新不及时,或者问题没有及时解答,希望大家谅解,再次感谢大家!!

因为我引用了许多以前积累的类库,所以有些东西是重复的(后来更新),有些东西是过时的,包括我写的代码,希望大家不要纯粹的复制,取其精华去其糟粕>_<。

在项目最后我会把每个部分、每个阶段的Demo提供下载给大家,其实,如果跟着做完,并且剔除掉了我代码不好的地方,你也不需要这些Demo了,是吧~

索引

 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(1)搭建MVC环境 注册区域

 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(2)创建数据库和数据模型

 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(3)公共基础数据操作类 RepositoryBase

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

 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.1) 登录功能的实现,开始接触Spring IOC、DI

简述

前两天事情比较多,耽误更新了,希望大家多多包涵,今天我们继续做我们的登录功能

项目准备

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

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

项目开始

一、Spring容器的配置注入

前一篇,我们新建了几个

我们之前讲过,Com呢表示我们一些通用的东西,就像我们的通用类库叫Common,这只是个人的命名习惯,并非MVC要求我们。因为我们创建的用户表是管理员表,所以我把这个配置放到Service.

 

 

代码:

1 <?"1.0" encoding="utf-8" ?>2 <objects "http://www.springframework.net">3  <description>Spring注入Service,容器指向本层层封装的接口,舍弃Dao层,减少代码量</description>4  <!--系统管理begin-->5  <!--用户管理-->6  <object id="Service.User" type="Service.ServiceImp.UserManage,Service" singleton="false">7  </object>8  <!--系统管理end-->9 </objects>

View Code

 

二、Log4net

我们在此插入一段,了解一下log4net记录日志,这个后面我们很多地方都要用到。

log4net是一个功能著名的开源日志记录组件。利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中。并且我们还可以记载控制要记载的日志级别,可以记载的日志类别包括:FATAL(致命错误)、ERROR(一般错误)、WARN(警告)、INFO(一般信息)、DEBUG(调试信息)。大部分的日志记录都是记录到文件,我们主要记录到数据库,这比较有利于我们的管理员查看日志事件。

1、安装log4net

安装方式一:http://logging.apache.org/log4net/

安装方式二(推荐):通过NuGet安装log4net  命令:Install-Package log4net

 

2、在项目的程序集信息描述文件中,设置Log4net的可记录属性

[assembly: log4net.Config."log4net.config", Watch = true)]

 

3、在程序根目录添加log4net的配置文件 log4net.config

 

 

我把配置代码贴给大家:

 1 <?"1.0" encoding="utf-8"?> 2 <configuration> 3  <configSections> 4   <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> 5  </configSections> 6  <log4net> 7   <root> 8    <level value="ALL"/> 9   </root> 10   <logger name="dblog" additivity="false"> 11    <level value="ALL"/> 12    <appender-ref ref="SqlServerAppender" /> 13   </logger> 14   <!--Oracle数据库--> 15   <appender name="OracleAppender" type="log4net.Appender.AdoNetAppender"> 16    <!-- Oracle数据源--> 17    <connectionType value="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 18    <!-- Oracle连接字符串--> 19    <connectionString value="DATA SOURCE=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.206)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)));PASSWORD=watdb;PERSIST SECURITY INFO=True;USER ID=watdb;"/> 20    <commandText value="INSERT INTO SYS_LOG(Dates,Levels,Logger,Message,Exception,ClientUser,ClientIP,RequestUrl,Action)VALUES(:Dates,:Levels,:Logger,:Message,:Exception,:ClientUser,:ClientIP,:RequestUrl,:Action)"/> 21    <!--  22        设置缓存区大小  23        1表明有一条日志就要写入  24        如果10就表示日志到达10条时一起写入  25       --> 26    <bufferSize value="0"/> 27    <parameter> 28     <parameterName value=":Dates" /> 29     <dbType value="DateTime" /> 30     <layout type="log4net.Layout.RawTimeStampLayout"/> 31    </parameter> 32    <parameter> 33     <parameterName value=":Levels" /> 34     <dbType value="String" /> 35     <size value="50" /> 36     <layout type="log4net.Layout.PatternLayout"> 37      <conversionPattern value="%level" /> 38     </layout> 39    </parameter> 40    <parameter> 41     <parameterName value=":Logger" /> 42     <dbType value="String" /> 43     <size value="200" /> 44     <layout type="log4net.Layout.PatternLayout"> 45      <conversionPattern value="%logger" /> 46     </layout> 47    </parameter> 48    <parameter> 49     <parameterName value=":Message" /> 50     <dbType value="String" /> 51     <size value="4000" /> 52     <layout type="log4net.Layout.PatternLayout"> 53      <conversionPattern value="%message" /> 54     </layout> 55    </parameter> 56    <parameter> 57     <parameterName value=":Exception" /> 58     <dbType value="String" /> 59     <size value="4000" /> 60     <layout type="log4net.Layout.PatternLayout"> 61      <conversionPattern value="%exception" /> 62     </layout> 63    </parameter> 64    <!--DIY--> 65    <parameter> 66     <parameterName value=":ClientUser" /> 67     <dbType value="String" /> 68     <size value="100" /> 69     <layout type="log4net.Layout.PatternLayout"> 70      <conversionPattern value="%property{ClientUser}" /> 71     </layout> 72    </parameter> 73    <parameter> 74     <parameterName value=":ClientIP" /> 75     <dbType value="String" /> 76     <size value="20" /> 77     <layout type="log4net.Layout.PatternLayout"> 78      <conversionPattern value="%property{ClientIP}" /> 79     </layout> 80    </parameter> 81    <parameter> 82     <parameterName value=":RequestUrl" /> 83     <dbType value="String" /> 84     <size value="500" /> 85     <layout type="log4net.Layout.PatternLayout"> 86      <conversionPattern value="%property{RequestUrl}" /> 87     </layout> 88    </parameter> 89    <parameter> 90     <parameterName value=":Action" /> 91     <dbType value="String" /> 92     <size value="20" /> 93     <layout type="log4net.Layout.PatternLayout"> 94      <conversionPattern value="%property{Action}" /> 95     </layout> 96    </parameter> 97   </appender> 98   <!--Sqlite数据库--> 99   <appender name="SqliteAppender" type="log4net.Appender.AdoNetAppender">100    <bufferSize value="0" />101    <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.98.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />102    <connectionString value="Data Source=|DataDirectory|test.db;Version=3;" />103    <commandText value="INSERT INTO Log (Date, Level, Logger, ClientUser,ClientIP, RequestUrl,Action, Message, Exception) VALUES (@Date, @Level, @Logger,@ClientUser,@ClientIP, @RequestUrl,@Action, @Message, @Exception)" />104    <parameter>105     <parameterName value="@Date" />106     <dbType value="DateTime" />107     <layout type="log4net.Layout.RawTimeStampLayout" />108    </parameter>109    <parameter>110     <parameterName value="@Level" />111     <dbType value="String" />112     <layout type="log4net.Layout.PatternLayout">113      <conversionPattern value="%level" />114     </layout>115    </parameter>116    <parameter>117     <parameterName value="@Logger" />118     <dbType value="String" />119     <layout type="log4net.Layout.PatternLayout">120      <conversionPattern value="%logger" />121     </layout>122    </parameter>123    <parameter>124     <parameterName value="@ClientUser" />125     <dbType value="String" />126     <layout type="log4net.Layout.PatternLayout">127      <conversionPattern value="%property{ClientUser}" />128     </layout>129    </parameter>130    <parameter>131     <parameterName value="@ClientIP" />132     <dbType value="String" />133     <layout type="log4net.Layout.PatternLayout">134      <conversionPattern value="%property{ClientIP}" />135     </layout>136    </parameter>137    <parameter>138     <parameterName value="@RequestUrl" />139     <dbType value="String" />140     <layout type="log4net.Layout.PatternLayout">141      <conversionPattern value="%property{RequestUrl}" />142     </layout>143    </parameter>144    <parameter>145     <parameterName value="@Action" />146     <dbType value="String" />147     <layout type="log4net.Layout.PatternLayout">148      <conversionPattern value="%property{Action}" />149     </layout>150    </parameter>151    <parameter>152     <parameterName value="@Message" />153     <dbType value="String" />154     <layout type="log4net.Layout.PatternLayout">155      <conversionPattern value="%message" />156     </layout>157    </parameter>158    <parameter>159     <parameterName value="@Exception" />160     <dbType value="String" />161     <layout type="log4net.Layout.PatternLayout">162      <conversionPattern value="%exception" />163     </layout>164    </parameter>165   </appender>166   <!--SqlServer数据库-->167   <appender name="SqlServerAppender" type="log4net.Appender.AdoNetAppender">168    <!-- SqlServer数据源-->169    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />170    <!-- SqlServer连接字符串-->171    <connectionString value="data source=.;initial catalog=wkmvc_db;integrated security=false;persist security info=True;User ID=sa_wkmvc;Password=123456" />172    <commandText value="INSERT INTO SYS_LOG(Dates,Levels,Logger,ClientUser,ClientIP,RequestUrl,Action,Message,Exception)VALUES(@Dates,@Levels,@Logger,@ClientUser,@ClientIP,@RequestUrl,@Action,@Message,@Exception)"/>173    <!-- 174        设置缓存区大小 175        1表明有一条日志就要写入 176        如果10就表示日志到达10条时一起写入 177       -->178    <bufferSize value="0"/>179    <parameter>180     <parameterName value="@Dates" />181     <dbType value="DateTime" />182     <layout type="log4net.Layout.RawTimeStampLayout" />183    </parameter>184    <parameter>185     <parameterName value="@Levels" />186     <dbType value="String" />187     <size value="50" />188     <layout type="log4net.Layout.PatternLayout">189      <conversionPattern value="%level" />190     </layout>191    </parameter>192    <parameter>193     <parameterName value="@Logger" />194     <dbType value="String" />195     <size value="255" />196     <layout type="log4net.Layout.PatternLayout">197      <conversionPattern value="%logger" />198     </layout>199    </parameter>200    <parameter>201     <parameterName value="@Message" />202     <dbType value="String" />203     <size value="4000" />204     <layout type="log4net.Layout.PatternLayout">205      <conversionPattern value="%message" />206     </layout>207    </parameter>208    <parameter>209     <parameterName value="@Exception" />210     <dbType value="String" />211     <size value="2000" />212     <layout type="log4net.Layout.ExceptionLayout" />213    </parameter>214    <!--DIY-->215    <parameter>216     <parameterName value="@ClientUser" />217     <dbType value="String" />218     <size value="100" />219     <layout type="log4net.Layout.PatternLayout" >220      <param name="ConversionPattern" value="%property{ClientUser}"/>221     </layout>222    </parameter>223    <parameter>224     <parameterName value="@ClientIP" />225     <dbType value="String" />226     <size value="100" />227     <layout type="log4net.Layout.PatternLayout" >228      <param name="ConversionPattern" value="%property{ClientIP}"/>229     </layout>230    </parameter>231    <parameter>232     <parameterName value="@RequestUrl" />233     <dbType value="String" />234     <size value="500" />235     <layout type="log4net.Layout.PatternLayout" >236      <param name="ConversionPattern" value="%property{RequestUrl}"/>237     </layout>238    </parameter>239    <parameter>240     <parameterName value="@Action" />241     <dbType value="String" />242     <size value="100" />243     <layout type="log4net.Layout.PatternLayout" >244      <param name="ConversionPattern" value="%property{Action}"/>245     </layout>246    </parameter>247   </appender>248   <!--记录到文件-->249   <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">250    <param name="File" value="datalog" />251    <param name="AppendToFile" value="true" />252    <param name="RollingStyle" value="Date" />253    <param name="DatePattern" value="\\yyyy\\MM-dd-HH\\&quot;SQL_&quot;yyyy-MM-dd&quot;.log&quot;" />254    <param name="StaticLogFileName" value="false" />255    <layout type="log4net.Layout.PatternLayout,log4net">256     <param name="ConversionPattern" value="%d - %m%n" />257     <param name="Header" value="&#xD;&#xA;----------------------begin--------------------------&#xD;&#xA;" />258     <param name="Footer" value="&#xD;&#xA;----------------------end--------------------------&#xD;&#xA;" />259    </layout>260   </appender>261  </log4net>262  <!--必须指定框架,否则不执行,新版本默认支持4.0,可修改源文件,项目属性设定为.NET FRAMEWORK2.0后,打开重新编译,去掉其中的.NET 4.0编译导致错误环节,如此只能使用在.net 2.0框架-->263  <startup>264   <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>265  </startup>266 </configuration>267 <!--268   调用实例269  log4net.ILog log = log4net.LogManager.GetLogger("Filelog");270   log.Info(Message);271  272   %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息273 274   %n(new line):换行275 276   %d(datetime):输出当前语句运行的时刻277 278   %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数279 280   %t(thread id):当前语句所在的线程ID281 282   %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等283 284   %c(class):当前日志对象的名称285   286   %L:输出语句所在的行号287 288   %F:输出语句所在的文件名289 290   %-数字:表示该项的最小长度,如果不够,则用空格填充291 292   例如,转换模式为%r [%t]%-5p %c - %m%n 的 PatternLayout 将生成类似于以下内容的输出:293 294   176 [main] INFO org.foo.Bar - Located nearest gas station.295   -->

View Code

 

4、上面的代码中,我们配置日志记录到了数据库的日志表 SYS_LOG

我们在数据库中新建这个日志表:

 

 

数据库名:wkmvc_db
表名:SYS_LOG
 
序号列名数据类型长度小数位标识主键外键允许空默认值说明
1IDint40  主键ID
2DATESdatetime83    创建时间
3LEVELSnvarchar200    日志等级
4LOGGERnvarchar2000    日志调用
5CLIENTUSERnvarchar1000    使用用户
6CLIENTIPnvarchar200    访问IP
7REQUESTURLnvarchar5000    访问来源
8ACTIONnvarchar200    操作动作
9MESSAGEnvarchar40000    消息
10EXCEPTIONnvarchar40000    异常消息

 



T-SQL:

 1 USE [wkmvc_db] 2 GO 3 /****** Object: Table [dbo].[SYS_LOG]  Script Date: 2016/5/16 9:06:19 ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET QUOTED_IDENTIFIER ON 7 GO 8 CREATE TABLE [dbo].[SYS_LOG]( 9   [ID] [int] IDENTITY(1,1) NOT NULL,10   [DATES] [datetime] NULL,11   [LEVELS] [nvarchar](20) NULL,12   [LOGGER] [nvarchar](200) NULL,13   [CLIENTUSER] [nvarchar](100) NULL,14   [CLIENTIP] [nvarchar](20) NULL,15   [REQUESTURL] [nvarchar](500) NULL,16   [ACTION] [nvarchar](20) NULL,17   [MESSAGE] [nvarchar](4000) NULL,18   [EXCEPTION] [nvarchar](4000) NULL,19 CONSTRAINT [PK_SYS_LOG] PRIMARY KEY CLUSTERED 20 (21   [ID] ASC22 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]23 ) ON [PRIMARY]24 25 GO26 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'主键ID' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'ID'27 GO28 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'创建时间' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'DATES'29 GO30 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志等级' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'LEVELS'31 GO32 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'日志调用' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'LOGGER'33 GO34 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'使用用户' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'CLIENTUSER'35 GO36 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'访问IP' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'CLIENTIP'37 GO38 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'访问来源' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'REQUESTURL'39 GO40 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'操作动作' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'ACTION'41 GO42 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'消息' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'MESSAGE'43 GO44 EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'异常消息' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'SYS_LOG', @level2type=N'COLUMN',@level2name=N'EXCEPTION'45 GO

View Code

 

三、新建用户登录控制器 AccountController

在/Areas/SysManage/Controllers 下新建AccountController控制器

 

个人习惯,我们分块控制器的代码,便于收缩、管理 用#region #endregion,#region是c#预处理器指令,是一个分块预处理命令,它主要用于编辑代码的分段,在编译时会被自动删除。

 

 

先贴一下这个代码:

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6  7 namespace WebPage.Areas.SysManage.Controllers 8 { 9   public class AccountController : Controller10   {11     #region 声明容器12     #endregion13 14     #region 基本视图15     public ActionResult Index()16     {17       return View();18     }19     #endregion20 21     #region 帮助方法22     #endregion23   }24 }

View Code

 

我们上一篇,在Config文件夹下面建立了三个

 

 

代码:

 1 <?"1.0" encoding="utf-8" ?> 2 <objects "http://www.springframework.net"> 3  <description>Spring注入控制器,容器指向Service层封装的接口</description> 4  <!--系统管理 Begin--> 5  <!--登录控制器--> 6  <object type="WebPage.Areas.SysManage.Controllers.AccountController,WebPage" singleton="false"> 7   <property name="UserManage" ref="Service.User"/> 8  </object> 9  <!--系统管理 end-->10 </objects>

View Code

 

OK,我们再回到我们的AccountController

我们添加一下解决方案的引用

 

我们在声明容器里声明一下UserManage

 

我们在基本视图里,为Index添加一个视图:(这里面没有验证,大家不要急,我们后面慢慢修改这个页面,我们先实现基本功能)

 1 @model Domain.SYS_USER 2 <!DOCTYPE html> 3 <html> 4 <head> 5   <meta charset="utf-8"> 6   <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 7   <meta name="viewport" content="width=device-width, initial-scale=1.0"> 8   <title>后台登录</title> 9 </head>10 <body>11   <div >12     <div>13       @using (Ajax.BeginForm("login", null, new AjaxOptions()14             {15               HttpMethod = "Post",16               OnBegin = "dig.Loading",17               OnSuccess = "dig.Success",18               OnFailure = "dig.Failure",19               OnComplete = "dig.Complete"20             }, new { @class = "form-signin" }))21       {22         @Html.AntiForgeryToken()23         @Html.TextBoxFor(model => model.ACCOUNT,24                             new25                             {26                               @class = "form-control",27                               @placeholder = "登录用户名",28                               @maxlength = 15,29                               @required = "required"30                             })31         @Html.PasswordFor(model => model.PASSWORD,32                             new33                             {34                               @class = "form-control",35                               @placeholder = "登录密码",36                               @maxlength = 12,37                               @required = "required"38                             })           39         <button type="submit" id="login-button"></button>40       }41      42     </div>43   44   </div>45 46  47   <script type="text/javascript" src="http://www.cnblogs.com//Content/js/jquery.min.js"></script>48   <script type="text/javascript" src="http://www.cnblogs.com//Content/js/jquery.unobtrusive-ajax.min.js"></script>49   <script type="text/javascript">    50     var dig = {51       Loading: function () {52         $("#login-button").attr("disabled", "disabled");;53       },54       Success: function (result) {55         if (result.Status == "y") {56           alert(result.Msg)57         } else {58           alert(result.Msg);59           dig.Complete();60         }61       },62       Failure: function () {63         alert(result.Msg);64         dig.Complete();65       },66       Complete: function () {67         $("#login-button").attr("disabled", false);68       },69       ErrorMsg: function (msg) {70         alert(msg);71       }72     };73   </script>74 75 </body>76 </html>

View Code

 我们新建一个登陆验证的方法 Login

 1     /// <summary> 2     /// 登录验证 3     /// add yuangang by 2016-05-16 4     /// </summary> 5     [ValidateAntiForgeryToken] 6     public ActionResult Login(Domain.SYS_USER item) 7     { 8       var json = new JsonHelper() { Msg = "登录成功", Status = "n" }; 9       try10       {11         //调用登录验证接口 返回用户实体类12         var users = UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWORD.Trim());13         if (users != null)14         {15           //是否锁定16           if (users.ISCANLOGIN == 1)17           {18             json.Msg = "用户已锁定,禁止登录,请联系管理员进行解锁";19             return Json(json);20           }21           json.Status = "y";22 23         }24         else25         {26           json.Msg = "用户名或密码不正确";27         }28 29       }30       catch (Exception e)31       {32         json.Msg = e.Message;33       }34       return Json(json, JsonRequestBehavior.AllowGet);35     }

View Code

 

重新生成一下解决方案,我们来测试一下

 

 

咦~~报错了~~~(不要担心报错,报错是我们DeBug并且梳理流程的好机会哈~)

 

我们先来研究一下这个错误:

捕捉到 System.NullReferenceException
HResult=-2147467261
Message=未将对象引用设置到对象的实例。
Source=WebPage
StackTrace:
在 WebPage.Areas.SysManage.Controllers.AccountController.Login(SYS_USER item) 位置 e:\Visual Studio 2013\BlogDemos\wkmvc\WebPage\Areas\SysManage\Controllers\AccountController.cs:行号 37

这是什么错误呢,错误在这一行 var users = UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWORD.Trim()); 这应该是UserManage 未将对象引用设置到对象的实例,我们分析,有可能是我们声明的容器出错了。

但是,我们的声明和注入貌似没有什么问题啊,那是怎么回事呢,我们看一下 我们Web.Config里的配置

我们还没有添加Spring.net组件啊~~~

添加一下,NetGet包 

 

还有Common.Logging

我们的Spring有几个dll 分别是Spring.Core、Common.Logging、Spring.Web.Mvc(我们这里用的是Spring.Web.Mvc5)

检查一下,这几个dll是否引用了

 

现在运行一下,是不是还是报错呢~~还是为将对象设置引用到实例~~怎么回事呢?好像忘了些什么,仅仅只是配置配好了,spring.net的容器还没有接管这一切……在这我们只需要让Global.asax文件的MvcApplication类继承于Spring.Web.Mvc.SpringMvcApplication类即可,根据需要override相关方就可以了

 

 

OK!运行正常~~~~

 

 

可能出现的问题:

 

或:

 

解决:

我们添加Microsoft.AspNet.WebApi(如果存在就更新一下)

 

或通过NuGet 程序包管理器控制台添加:

Install-Package Microsoft.AspNet.WebApi

Update-Package Microsoft.AspNet.WebApi -reinstall(存在)

原因:我们新建的是一个空的MVC项目,缺少引用

 

 

四、使用Log4net

我们添加一下log4net的类库 【C#公共帮助类】 Log4net 帮助类

 

我们在AccountController控制器中声明一下

 

 

我们修改一下 登录验证方法Login

 

 

代码:

 1 using Common; 2 using Service.IService; 3 using System; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Web; 7 using System.Web.Mvc; 8  9 namespace WebPage.Areas.SysManage.Controllers10 {11   public class AccountController : Controller12   {13     #region 声明容器14     /// <summary>15     /// 用户管理16     /// add yuangang by 2016-05-1617     /// </summary>18     IUserManage UserManage { get; set; }19     /// <summary>20     /// 日志记录21     /// </summary>22     log4net.Ext.IExtLog log = log4net.Ext.ExtLogManager.GetLogger("dblog");23     #endregion24 25     #region 基本视图26     public ActionResult Index()27     {28       return View();29     }30     /// <summary>31     /// 登录验证32     /// add yuangang by 2016-05-1633     /// </summary>34     [ValidateAntiForgeryToken]35     public ActionResult Login(Domain.SYS_USER item)36     {37       var json = new JsonHelper() { Msg = "登录成功", Status = "n" };38       try39       {40         //调用登录验证接口 返回用户实体类41         var users = UserManage.UserLogin(item.ACCOUNT.Trim(), item.PASSWORD.Trim());42         if (users != null)43         {44           //是否锁定45           if (users.ISCANLOGIN == 1)46           {47             json.Msg = "用户已锁定,禁止登录,请联系管理员进行解锁";48             log.Warn(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);49             return Json(json);50           }51           json.Status = "y";52           log.Info(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);53 54         }55         else56         {57           json.Msg = "用户名或密码不正确";58           log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);59         }60 61       }62       catch (Exception e)63       {64         json.Msg = e.Message;65         log.Error(Utils.GetIP(), item.ACCOUNT, Request.Url.ToString(), "Login", "系统登录,登录结果:" + json.Msg);66       }67       return Json(json, JsonRequestBehavior.AllowGet);68     }69     #endregion70 71     #region 帮助方法72     #endregion73   }74 }

View Code

 

今天就先写到这,下一篇,我们继续完善这个登录功能~~~好累~~~

你们先自己做一下,遇到问题百度也好,留言也好,咱们解决一下。稍后我把这一部分的Demo 提供一下下载。

 

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