【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.2) 登录功能的实现,接口注入、log4net的使用
索引
【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目 目录索引
简述
前两天事情比较多,耽误更新了,希望大家多多包涵,今天我们继续做我们的登录功能
项目准备
我们用的工具是:VS 2013 + SqlServer 2012 + IIS7.5
希望大家对ASP.NET MVC有一个初步的理解,理论性的东西我们不做过多解释,有些地方不理解也没关系,会用就行了,用的多了,用的久了,自然就理解了。
项目开始
一、Spring容器的配置注入
前一篇,我们新建了几个Xml配置文件,并且我们创建了用户接口和实现类,今天,首先呢,我们来注入Service,我们之前在Service类库下面新建了个文件夹Config并且添加了两个嵌入资源ComService.xml和Service.xml。
我们之前讲过,Com呢表示我们一些通用的东西,就像我们的通用类库叫Common,这只是个人的命名习惯,并非MVC要求我们。因为我们创建的用户表是管理员表,所以我把这个配置放到Service.xml里,我们来修改一下Service.xml
代码:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <objects xmlns="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>
二、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.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
3、在程序根目录添加log4net的配置文件 log4net.config
我把配置代码贴给大家:
1 <?xml version="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):当前语句所在的线程ID 281 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 -->
4、上面的代码中,我们配置日志记录到了数据库的日志表 SYS_LOG
我们在数据库中新建这个日志表:
|
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] ASC 22 )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 GO 26 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 GO 28 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 GO 30 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 GO 32 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 GO 34 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 GO 36 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 GO 38 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 GO 40 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 GO 42 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 GO 44 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
三、新建用户登录控制器 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 : Controller 10 { 11 #region 声明容器 12 #endregion 13 14 #region 基本视图 15 public ActionResult Index() 16 { 17 return View(); 18 } 19 #endregion 20 21 #region 帮助方法 22 #endregion 23 } 24 }
我们上一篇,在Config文件夹下面建立了三个xml文件,并且在Web.Config里面配置了指向,我们在Controllers.xml里配置一下接口的指向
代码:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <objects xmlns="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>
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 new 25 { 26 @class = "form-control", 27 @placeholder = "登录用户名", 28 @maxlength = 15, 29 @required = "required" 30 }) 31 @Html.PasswordFor(model => model.PASSWORD, 32 new 33 { 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="/Content/js/jquery.min.js"></script> 48 <script type="text/javascript" src="/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>
我们新建一个登陆验证的方法 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 try 10 { 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 else 25 { 26 json.Msg = "用户名或密码不正确"; 27 } 28 29 } 30 catch (Exception e) 31 { 32 json.Msg = e.Message; 33 } 34 return Json(json, JsonRequestBehavior.AllowGet); 35 }
重新生成一下解决方案,我们来测试一下
咦~~报错了~~~(不要担心报错,报错是我们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.Controllers 10 { 11 public class AccountController : Controller 12 { 13 #region 声明容器 14 /// <summary> 15 /// 用户管理 16 /// add yuangang by 2016-05-16 17 /// </summary> 18 IUserManage UserManage { get; set; } 19 /// <summary> 20 /// 日志记录 21 /// </summary> 22 log4net.Ext.IExtLog log = log4net.Ext.ExtLogManager.GetLogger("dblog"); 23 #endregion 24 25 #region 基本视图 26 public ActionResult Index() 27 { 28 return View(); 29 } 30 /// <summary> 31 /// 登录验证 32 /// add yuangang by 2016-05-16 33 /// </summary> 34 [ValidateAntiForgeryToken] 35 public ActionResult Login(Domain.SYS_USER item) 36 { 37 var json = new JsonHelper() { Msg = "登录成功", Status = "n" }; 38 try 39 { 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 else 56 { 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 #endregion 70 71 #region 帮助方法 72 #endregion 73 } 74 }
今天就先写到这,下一篇,我们继续完善这个登录功能~~~好累~~~
你们先自己做一下,遇到问题百度也好,留言也好,咱们解决一下。稍后我把这一部分的Demo 提供一下下载。
原创文章 转载请尊重劳动成果 http://yuangang.cnblogs.com