【無私分享:從入門到精通ASP.NET MVC】從0開始,一塊兒搭框架、作項目(5.2) 登陸功能的實現,接口注入、log4net的使用

索引javascript

【無私分享:從入門到精通ASP.NET MVC】從0開始,一塊兒搭框架、作項目 目錄索引

簡述html

前兩天事情比較多,耽誤更新了,但願你們多多包涵,今天咱們繼續作咱們的登陸功能java

項目準備jquery

咱們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5ajax

但願你們對ASP.NET MVC有一個初步的理解,理論性的東西咱們不作過多解釋,有些地方不理解也不要緊,會用就好了,用的多了,用的久了,天然就理解了。spring

項目開始chrome

1、Spring容器的配置注入數據庫

前一篇,咱們新建了幾個Xml配置文件,而且咱們建立了用戶接口和實現類,今天,首先呢,咱們來注入Service,咱們以前在Service類庫下面新建了個文件夾Config而且添加了兩個嵌入資源ComService.xml和Service.xml。apache

咱們以前講過,Com呢表示咱們一些通用的東西,就像咱們的通用類庫叫Common,這只是我的的命名習慣,並不是MVC要求咱們。由於咱們建立的用戶表是管理員表,因此我把這個配置放到Service.xml裏,咱們來修改一下Service.xmljson

 

 

代碼:

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

 

2、Log4net

咱們在此插入一段,瞭解一下log4net記錄日誌,這個後面咱們不少地方都要用到。

log4net是一個功能著名的開源日誌記錄組件。利用log4net能夠方便地將日誌信息記錄到文件、控制檯、Windows事件日誌和數據庫(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中。而且咱們還能夠記載控制要記載的日誌級別,能夠記載的日誌類別包括:FATAL(致命錯誤)、ERROR(通常錯誤)、WARN(警告)、INFO(通常信息)、DEBUG(調試信息)。大部分的日誌記錄都是記錄到文件,咱們主要記錄到數據庫,這比較有利於咱們的管理員查看日誌事件。

一、安裝log4net

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

安裝方式二(推薦):經過NuGet安裝log4net  命令:Install-Package log4net

 

二、在項目的程序集信息描述文件中,設置Log4net的可記錄屬性

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

 

三、在程序根目錄添加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\\&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

 

四、上面的代碼中,咱們配置日誌記錄到了數據庫的日誌表 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

 

3、新建用戶登陸控制器 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項目,缺乏引用

 

 

4、使用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

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息
相關文章