我是靠谱客的博主 务实星星,这篇文章主要介绍【无私分享:从入门到精通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
2
3
4
5
6
7
8
9
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>
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的可记录属性

复制代码
1
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

 

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

 

 

我把配置代码贴给大家:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
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\&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):当前语句所在的线程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 -->
View Code

 

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

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

 

 

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

 

T-SQL:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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
View Code

 

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

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

 

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

 

 

先贴一下这个代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 }
View Code

 

我们上一篇,在Config文件夹下面建立了三个xml文件,并且在Web.Config里面配置了指向,我们在Controllers.xml里配置一下接口的指向

 

 

代码:

复制代码
1
2
3
4
5
6
7
8
9
10
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>
View Code

 

OK,我们再回到我们的AccountController

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

 

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

 

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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>
View Code

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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 }
View Code

 

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

 

 

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

 

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

捕捉到 System.NullReferenceException
HResult=-2147467261
Message=未将对象引用设置到对象的实例。
Source=WebPage
StackTrace:
在 WebPage.Areas.SysManage.Controllers.AccountController.Login(SYS_USER item) 位置 e:Visual Studio 2013BlogDemoswkmvcWebPageAreasSysManageControllersAccountController.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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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 }
View Code

 

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

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

 

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

转载于:https://www.cnblogs.com/yuangang/p/5497140.html

最后

以上就是务实星星最近收集整理的关于【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.2) 登录功能的实现,接口注入、log4net的使用...的全部内容,更多相关【无私分享:从入门到精通ASP.NET内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部