声明:本系列为原创,分享本人现用框架,未经本人同意,禁止转载!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\\"SQL_"yyyy-MM-dd".log"" />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="
----------------------begin--------------------------
" />258 <param name="Footer" value="
----------------------end--------------------------
" />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
序号 | 列名 | 数据类型 | 长度 | 小数位 | 标识 | 主键 | 外键 | 允许空 | 默认值 | 说明 | 1 | ID | int | 4 | 0 | 是 | 是 | | 否 | | 主键ID | 2 | DATES | datetime | 8 | 3 | | | | 是 | | 创建时间 | 3 | LEVELS | nvarchar | 20 | 0 | | | | 是 | | 日志等级 | 4 | LOGGER | nvarchar | 200 | 0 | | | | 是 | | 日志调用 | 5 | CLIENTUSER | nvarchar | 100 | 0 | | | | 是 | | 使用用户 | 6 | CLIENTIP | nvarchar | 20 | 0 | | | | 是 | | 访问IP | 7 | REQUESTURL | nvarchar | 500 | 0 | | | | 是 | | 访问来源 | 8 | ACTION | nvarchar | 20 | 0 | | | | 是 | | 操作动作 | 9 | MESSAGE | nvarchar | 4000 | 0 | | | | 是 | | 消息 | 10 | EXCEPTION | nvarchar | 4000 | 0 | | | | 是 | | 异常消息 |
|
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='/images/loading.gif' data-original="http://www.cnblogs.com//Content/js/jquery.min.js"></script>48 <script type="text/javascript" src='/images/loading.gif' data-original="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
原标题:【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.2) 登录功能的实现,接口注入、log4net的使用
关键词:ASP.NET