- ASP.NET項目開發全程實錄(第4版)
- 明日科技
- 2077字
- 2019-12-06 12:04:36
1.6 登錄與注冊模塊設計
1.6.1 登錄和注冊模塊概述
登錄用戶可以進行發帖和回帖,被賦予權限的用戶還可以審核帖子、設置精華以及刪帖等操作。對于沒有賬號的用戶,系統會提供一個注冊用戶的頁面。如圖1.11所示為用戶登錄頁面。圖1.12為用戶注冊頁面。

圖1.11 登錄頁面

圖1.12 注冊頁面
1.6.2 登錄和注冊模塊技術分析
實現登錄和注冊模塊時,使用了ASP.NET MVC中的Razor視圖引擎,Razor是其中常用的視圖引擎之一,視圖文件的后綴名為.cshtml文件,它是在MVC3中出現的,語法格式上,與ASPX頁面的語法也是有區別,下面對Razor視圖引擎中常用的語法標記和一些幫助類進行講解。
1. @符號標記代碼塊
@符號是Razor視圖引擎的語法標記,它的功能和ASPX頁面中的<%%>標記相同,都是用于調用C#指令的。不過,Razor視圖引擎的@標記使用起來更加靈活簡單,下面將說明@符號的各種用法。
(1)單行代碼:使用一個“@”符號作為開始標記并且無結束標記,代碼如下:
<span>@DateTime.Now</span>
(2)多行代碼:多行代碼使用“@{code...}”標記代碼塊,在大括號內可以編寫C#代碼,并且可以隨時切換C#代碼與輸出Html標記,代碼如下:

(3)輸出純文本:如果在代碼塊中直接輸出純文本則使用“@:內容...”,這樣就可以在不使用Html標簽的情況下直接輸出文本,代碼如下:

(4)輸出多行純文本:如果要輸出多行純文本則使用“<text>”標簽,這樣就可以更方便的輸出多行純文本,代碼如下:

(5)輸出連續文本:如果需要在一行文本內容中間輸出變量值則使用“@()”標記,這樣就可以避免出現文本空格的現象,代碼如下:

2. Html幫助器
在設計cshtml頁面時我們會用到各種html標簽,這些標簽通常都是手動構建,例如<a href="">link</a>這樣的寫法,但在Razor視圖引擎中使用HtmlHelper類可以更加方便快速地實現這些標簽的定義。所以,在MVC中表單和鏈接推薦使用Html幫助器實現,其他標簽可根據需求選擇實現方式。
以下列舉幾個簡單常用的HtmlHelper類擴展方法:
(1)Raw方法:返回非HTML編碼的標記,調用方式如下:
@Html.Raw("<font color='red'>顏色</font>")
調用前頁面將顯示“<font color="red">顏色</font >”。
調用后頁面將顯示顏色為紅色的“顏色”二字。
(2)Encode方法:編碼字符串,以防止跨站腳本攻擊,調用方式如下:
@Html.Encode("<script type=\"text/javascript\"></script>")
返回編碼結果為“<script type="text/javascript"></script>”。
(3)ActionLink方法:生成一個連接到控制器行為的a標簽,調用方式如下:
@Html.ActionLink("關于", "About", "Home")
頁面生成的a標簽格式為“<a href="/Home/About">關于</a>”
(4)BeginForm方法:生成form表單,調用方式如下:

1.6.3 登錄和注冊模塊實現過程
本模塊使用的數據表:tb_UsersByCustomer、tb_ZY_Sex
1. 制作登錄頁面
由于登錄按鈕被放在了網站公共布局頁面中,所以在前臺的每個頁面中都能隨時登錄到系統中。那么,如果此時用戶是從某一個子版塊帖子列表中進行登錄系統的,則用戶登錄后頁面還需跳轉回上次閱讀的頁面中,這就需要在登錄前先記錄最后一次停留的頁面。
在設計布局頁面時,登錄按鈕就已經添加到了頁面上。再來看一下登錄按鈕的鏈接標簽:
例程18 代碼位置:資源包\TM\01\BBSSiteItem\BBSSite\BBSSite\Views\Shared\_LayoutBBSSite.cshtml
<a href="/Account/Login/@Convert.ToBase64String(System.Text.Encoding .Default.GetBytes(Request.Url.AbsolutePath))">登錄</a>
上面使用Base64將當前頁面的路徑進行了編碼操作,并作為參數傳遞到登錄頁面。這樣,即可以實現登錄后目標頁的跳轉工作。使用Base64編碼主要有兩個好處,一是由于當前頁面路徑也會存在以“/”斜線分割的路徑格式,所以會產生歧義性,從而導致無法準確地跳轉到登錄頁。二是在用戶的瀏覽器地址欄中不必將明文路徑呈現給用戶。
由于登錄模塊屬于用戶賬戶部分,所以,需要新建立一個控制器和對應的視圖文件夾來管理用戶的登錄或注冊功能。接下來首先設計登錄的頁面,在Views文件夾下的Account(如果沒有則創建)文件夾內添加一個Login.cshtml視圖文件,然后在視圖文件內設計頁面布局標簽。
首先,文件頂部需要引用LoginUsersByCustomerEntity模型用于綁定登錄控件。同時,設定登錄頁面不需要任何布局頁面,所以,指定Layout為空,代碼如下:
例程19 代碼位置:資源包\TM\01\BBSSiteItem\BBSSite\BBSSite\Views\Account\Login.cshtml

登錄控件使用了Html幫助類進行綁定,其中,Html幫助類中的ValidationMessage方法是在登錄失敗時,用于提示用戶錯誤消息的方法,代碼如下:
例程20 代碼位置:資源包\TM\01\BBSSiteItem\BBSSite\BBSSite\Views\Account\Login.cshtml


視圖完成后,添加對應的控制器和動作用于處理用戶請求。在控制器文件夾下建立Account(如果不存在)控制器,然后添加Login方法并指定一個參數,代碼如下:
例程21 代碼位置:資源包\TM\01\BBSSiteItem\BBSSite\BBSSite\Controllers\AccountController.cs

當用戶單擊登錄后,對應控制器中的DoLogin方法會執行驗證登錄邏輯代碼,其主要核心代碼如下:
例程22 代碼位置:資源包\TM\01\BBSSiteItem\BBSSite\BBSSite\Controllers\AccountController.cs

這是驗證登錄的核心代碼,在得到IsLoginSuccess的值后,按照成功與否選擇登錄成功的跳轉或提示用戶錯誤消息。
2. 制作注冊頁面
如果用戶在登錄時發現自己沒有可用的賬號進行登錄,則可以選擇注冊一個用戶。同樣,注冊用戶需要在Account文件夾內添加一個Register.cshtml視圖文件,然后在頁面中設計布局標簽。注冊頁面的標簽格式以及樣式基本與登錄頁面相同,只是用戶輸入控件要多于登錄頁面。
下面只列出form內的部分控件標簽,其他部分可參見本書資源包文件。
例程23 代碼位置:資源包\TM\01\BBSSiteItem\BBSSite\BBSSite\Views\Account\Register.cshtml

可以看到,每一個控件的后面都定義了提示信息,因此綁定控件的Html幫助類的方法也不同于登錄控件,因為注冊控件需要更多的屬性和事件,這些事件可以實現當用戶單擊了控件后,提示用戶文本內容的輸入標準等信息。
同樣,控制器中Action方法是必不可少的,在Register方法中,使用ViewBag動態類型綁定了性別下拉框項,代碼如下:
例程24 代碼位置:資源包\TM\01\BBSSiteItem\BBSSite\BBSSite\Controllers\AccountController.cs

當用戶單擊注冊按鈕后,會執行Account控制器中的DoRegister方法,代碼如下:
例程25 代碼位置:資源包\TM\01\BBSSiteItem\BBSSite\BBSSite\Controllers\AccountController.cs

當用戶注冊成功后會執行else中的代碼,這一部分主要將用戶信息保存到了session中,然后執行了頁面跳轉的過程。