索引javascript
簡述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>
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\\"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 -->
四、上面的代碼中,咱們配置日誌記錄到了數據庫的日誌表 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
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 }
咱們上一篇,在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項目,缺乏引用
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 }
今天就先寫到這,下一篇,咱們繼續完善這個登陸功能~~~好累~~~
大家先本身作一下,遇到問題百度也好,留言也好,我們解決一下。稍後我把這一部分的Demo 提供一下下載。
原創文章 轉載請尊重勞動成果 http://yuangang.cnblogs.com