TA的每日心情 | 开心 2021-12-13 21:45 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
|
索引
【无私分享:从入门到精通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>
复制代码
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.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 -->
复制代码
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] 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 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 <?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 @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 /// <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 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 }
复制代码
View Code
今天就先写到这,下一篇,我们继续完善这个登录功能~~~好累~~~
你们先自己做一下,遇到问题百度也好,留言也好,咱们解决一下。稍后我把这一部分的Demo 提供一下下载。
原创文章 转载请尊重劳动成果 http://yuangang.cnblogs.com |
|