程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 基於.net mvc的校友錄 六、codefirst的使用以及班級模塊的關鍵部分實現

基於.net mvc的校友錄 六、codefirst的使用以及班級模塊的關鍵部分實現

編輯:關於.NET

通過EF將新用戶存入數據庫

這裡,探討一下如何使用EF的code first將數據存入數據庫,以及如何對用戶的密碼進行md5加密與驗證。下面是用戶登陸的前台代碼。

@using (Html.BeginForm("ToLogin", "Log"))

{

   @Html.AntiForgeryToken()

   @Html.ValidationSummary(true)

<div>

<div>

   <section id="loginForm">

   <span style="font-size:14px;color:red">

   @ViewBag.error</span>

   @Html.TextBoxFor(m => m.UserName, new { @class = "logoText" })

 </div>

詳細代碼見附錄

 </div>

}

此代碼是前台登陸頁面中的form部分,Html.BeginForm是定義一個Form,可以直接用<form>標簽代替。@ViewBag.error是後台傳過來的數據,目標是在用戶登陸錯誤的時候,再次顯示此頁面時,ViewBag.error將帶有用戶名與密碼組合不錯誤等類似提示信息,呈現給用戶。@html.textboxfor其實就是一個生成<input>標簽的方法,這個之前有講過,此處不再多說。看一下後面的new{},這是一個匿名類,其實就是一個臨時對象,因為要控制input的樣式,不然自動生成的input會破壞登陸頁面風格,這裡給它傳去了一個對象,當它發現對象有一個屬性與它的屬性名一樣的時候,它會把那個屬性的值給自己的屬性賦上,然後就是UserName的input標簽有了logoText這個類,在css中可以通過.logoText來控制這個input。@Html.ActionLink是用來生成超鏈接的,一般沒必要用,直接用a標簽就可以了,這地方測試性的使用了一下。當用戶提交了這個表單之後,數據會封裝在request中,以post方式傳送到後台。後台的接受方法代碼如下:

public ActionResult ToLogin(LoginModel lm)

 {

     using (AlumniBookModel db = new AlumniBookModel())

     {

         lm.Password = Sleep.GetMD5(lm.Password);

         var query = from m in db.User

  where m.UserName == lm.UserName && m.Password== lm.Password

                     select m;

         if (query.ToList<User>().Count() > 0)

         {

             詳細代碼見附錄

         }

     }

     ViewBag.error="您的用戶名與密碼組合有誤,請重試";

     return View("Login");

 }

ToLogin方法是控制器LogController的方法,當前台用戶提交登陸表單的時候,會以post方式傳到這個方法上。方法執行的時候,會先實例化一個數據庫上下文,就是AlumniBookModel的實例db。這個db可以理解成是系統的數據庫。ToLogin的方法參數是LoginModel類型的,而登陸頁面代碼最上面的有一句代碼是@model AlumniBook.Models.LoginModel,也就是說登陸頁面是強類型頁面,而具體的類型就是LoginModel,這個LoginModel並不是數據實體模型類,它不存在於數據中,只用來作為前後台傳輸數據的載體。ToLogin方法會從LoginModel的實例lm中取得password,然後調用封裝在SLeep類中的靜態方法GetMD5來將密碼轉成32位md5密文。然後,下面那一句就是經典的linq了,以var來定義一個動態類型變量query,這個query其實是一個查詢類型,查詢類型可以理解成是一個sql語句類似的東西,它在被使用時會自動執行查詢。也就是下面在它調用ToList()方法的時候,它從數據庫中查詢用戶名與密碼同lm相同的實體,如果結果的count不大於0,那麼說明這個用戶不存在,或者說用戶名密碼組合不正確。此時就可以判定用戶登陸失敗了,然後在ViewBag.error中賦值"您的用戶名與密碼組合有誤,請重試";再return View("Login")。這樣,用戶會再次返回到登陸頁面,不同的是,這次ViewBag.error中有數據,會顯示在頁面中,用戶會看見登陸失敗的提示。

若是用戶密碼組合正確,那麼將檢測lm的RememberMe屬性是否為true,這個屬性由用戶登陸時是否選擇記住我而決定。若是用戶選擇了,那麼會在cookies裡面存入用戶名。保存cookies方面.net不如thinkphp做得好用,.net需要先實例化一個cookie,然後將數據存入,再設定它的過期時間,然後加入到response的cookies中,返回給用戶之後,用戶的浏覽器會將此cookies保存。若是用戶沒有選擇記住我,那麼,不管cookies中有沒有用戶,都會將這個值刪除,這也是選擇了記住我的用戶取消自動登陸的一種方式。在其它需要驗證的地方,也都是在方法上面加上IsLoged特性。下面來看一下工具類內容,因為上面已經用到了。

查看本欄目

它包含了一個Class,存放學校名稱的字符串類型,要注意的是,本系統功能不會再加,為了盡量減少數據冗余,能不使用id的都沒有使用,比如用戶實體,直接用的是不可能重復的用戶名作為key,然後學校是以學校的名字作為key。所以,此處第二個字段,幾乎就可以認為是一個學校了,因為它可以確定唯一的一個學校。第三個字段是一個School列表,List一個集合。它用來傳送多個班級。

 public ActionResult ToCreate(CreateClass cc)

 {

     using (AlumniBookModel db = new AlumniBookModel())

     {

         ……

         {

             HttpPostedFileBase fc = Request.Files[0];

             if (fc != null)

             {

                 newClass.ClassCoverPath =FileHelper.SaveFile(fc);

             }

             ……

             db.Class.Add(newClass);

             db.SaveChanges();

return RedirectToAction("Index", new { className = newClass.ClassName });詳細代碼見附錄。

ToCreate是後台接受表單的方法,參數為CreateClass類型的cc。在實例化AlumniBookModel類型的db之後,實例化一個新的Class類newClass,這個類在修改之後,把它存放到db中。首先,先驗證這個班級是否已經存在,若是存在,則跳轉到Error頁面,並將title、msg信息放到ViewBag中傳過去顯示給用戶。若是班級不存在,那麼將執行創建班級的操作,先判定是否有圖片文件,有的話,就會用工具類將文件保存,然後重新以時間命名,返回新的名稱給newClass,放到ClassCoverPath中。將cc中的Class帶來的數據全部傳給newClass,最後將newClass添加到實體Class中,然後執行db.SaveChanges()。此時,剛剛的newClass已經保存到數據庫裡面了。

return RedirectToAction("Index", new { className = newClass.ClassName })與之前用的return View()不一樣,它是跳轉到一個控制器的方法,並且帶著參數,參數不是直接傳遞的,而是封裝在一個對象中,這裡用匿名類將數據封裝了進去,帶去的是班級名稱,因為跳轉到Index的時候,需要一個班級名,以進入指定的班級,而當前進入的正是剛剛新建的班級。

下面說一下,剛剛用到創建新學校的ajax代碼。此處的彈出窗口使用了JQUERY UI控件,js也使用了JQUERY庫。當用戶點擊創建新學校的時候,會觸發js事件$(" #createNewSchool"). button().click(function () { $ (" #newSchoolBox " ) .dialog(" open " ) ; } ) ;,然後會打開這個dialog,它的定義代碼為:

$("#newSchoolBox").dialog({

autoOpen: false,

width: 400,

height: 180,

buttons: [ { text: "Ok", click: function() {

這是這個聲明的前部,autoOpen表示是否默認打開,然後是高寬,最後是一個按鈕,這個按鈕直接定義了事件方法。

創建新學校對話框

彈出窗口中有一個ok按鈕,當用戶點擊之後,會觸發如下代碼:

$.ajax({

    type: 'POST',

    url: "/Class/ToCreateNewSchool",

    data: { 'newSchoolName': $("#newSchoolName").val() },

    success: function (data) {

    if (data.result == true) {

   alert("學校添加完成");

location.reload();

    } else if (data.result == false) {

  alert("學校已存在,請直接選擇");

$("#createNewSchoolBox").dialog("close");

    } else {

alert(data.result);

    }

},

    dataType: 'json',

});

這是一段jquery的ajax代碼,也就是傳說中的異步刷新,在說明書開始部分也有講過ajax這個技術,它給bs帶來了前所未有的變化,這是一場革命,webQQ,谷歌地圖等,無不是它的傑作。在這裡,data是要發送的數據,這個數據的類型要是json格式,$("#newSchoolName").val() 是將學校名稱的input標簽值取出,放在這裡面,然後當執行到此代碼的時候,浏覽器會向服務器發送一個包含了這個對象的請求,請求到了服務器端之後,服務端會驗證學校是否已經存,若存在則返回result=false的數據對象,然後此代碼中的判定語句會執行到alert,即彈出提示信息告訴用戶,學校已經存在,可以直接選擇。否則,控制器會創建一個學校,然後將result=true的對象發到前台來,此代碼接受到了之後,執行alert("學校添加完成"); location.reload();然後此頁面刷新,在下拉列表中就可以看見剛剛添加的學校了,選擇即可。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved