天天看點

《Pro ASP.NET MVC 3 Framework》學習筆記之十六【示例項目SportsStore】

送出訂單:這是SportsStore項目的最後一個功能了,結算并完成我們的訂單。

在Entities檔案夾裡添加一個ShippingDetails.cs,代碼如下:

《Pro ASP.NET MVC 3 Framework》學習筆記之十六【示例項目SportsStore】
《Pro ASP.NET MVC 3 Framework》學習筆記之十六【示例項目SportsStore】

View Code

注意這裡給屬性添加了一些validation attributes,需要引入一個命名空間:System.ComponentModel.DataAnnotations。

添加結算處理:我們的目标是能夠讓使用者添加快遞資訊和送出訂單。首先我們在購物車詳情頁面添加一個Checkout按鈕,修改Views/Cart/Index.cshtml如下:

接着我們在CartController裡面添加一個Checkout action方法,如下:

右鍵添加一個視圖Checkout,如下:

《Pro ASP.NET MVC 3 Framework》學習筆記之十六【示例項目SportsStore】

Checkout.cshtml的代碼如下:

《Pro ASP.NET MVC 3 Framework》學習筆記之十六【示例項目SportsStore】
《Pro ASP.NET MVC 3 Framework》學習筆記之十六【示例項目SportsStore】

我們使用Html.EditorFor輔助方法為每一個表單字段呈現input元素,我們讓MVC架構能夠算出view model屬性需要哪一種input元素,而不是顯示的指定。Html.EditorFor方法是Template View Helper一個例子,書後面的章節會進行詳細的講解。這裡我們能體驗到,MVC架構非常智能,會自動為bool類型的屬性呈現一個Checkbox(這裡的Gift Wrap).

Tip:我們可以使用一個簡單的方法Html.EditorForModel來為所有的屬性建立HTML元素.将上面的代碼注釋,然後加上@Html.EditorForModel().運作程式可以看看效果。我們這是分開寫的,為的是能夠直接引用每一個屬性。

接着實作訂單處理過程

我們需要一個元件來處理訂單的詳情,為了保持MVC model的嚴則,首先定義一個接口,并實作該接口。然後使用我們的DI容器--Ninject

在 SportsStore.Domain/Abstract的檔案夾裡面定義一個IOrderProcessor接口,如下所示:

《Pro ASP.NET MVC 3 Framework》學習筆記之十六【示例項目SportsStore】
《Pro ASP.NET MVC 3 Framework》學習筆記之十六【示例項目SportsStore】

接着實作該接口,這裡比較簡單的處理,僅僅發一封郵件告之。在 SportsStore.Domain/Concrete裡面建立一個EmailOrderProcessor類來實作該接口,如下所示:

《Pro ASP.NET MVC 3 Framework》學習筆記之十六【示例項目SportsStore】
《Pro ASP.NET MVC 3 Framework》學習筆記之十六【示例項目SportsStore】

接着使用Ninject綁定,在NinjectControllerFactory的修改AddBindings()如下:

對了,這裡的Email.WriteAsFile在配置檔案裡面配置的,主要是考慮沒有smtp伺服器時,将郵件複制到指定目錄。其實一般的郵箱都開通了smtp服務的,是以我們将這裡的預設值設為false。在Web.config裡面配置<add key="Email.WriteAsFile" value="false"/>

在Ninject裡面綁定時,這裡是帶了構造器參數,如果初次路過的朋友不是很清楚,可以看前面的比較,有針對Ninject的介紹。

接着完成CartController

我們需要修改CartController的構造器,現在需要增加IOrderProcessor類型的參數,并且需要增加一個新的action方法來處理當使用者點選完成訂單按鈕後的post請求。修改後如下:

這裡可以發現有這樣一個[HttpPost]特性修飾Checkout方法,表示該方法隻有發起post請求時才會被調用。當使用者送出表單以後,這裡又一次用到了Model Binding系統,分别針對ShippingDetails自動來自http的資料建立參數和Cart使用我們自定義的綁定模型建立參數。如果你使用了單元測試,這個是需要修改CartController的構造器,可以增加一個null參數來使編譯通過。

MVC架構通過使用data annotation attributes檢查我們對ShippingDetails應用的驗證限制,任何的驗證都會通過ModelState傳遞給action方法。我可以通過檢查ModelState.IsValid屬性來确定驗證過程産生的問題,比如是否為空等等。注意到這裡,如果沒有任何的項在購物車裡面,我們能夠調用ModelState.AddModelError方法來注冊一個錯誤的資訊.關于Model Binding和validation,書中第二部分有章節進行專門的講解,如果你這裡跟我一樣不太清楚,沒問題的。

展示驗證資訊

當使用者輸入了不合法的資料時,我們可以使用@Html.ValidationSummary()在顯示,當然這是在一個地方統一顯示。你也可以借助其他的方法來分開顯示不同的錯誤資訊。比如這修改Checkout.cshtml如下:

展示效果如下:

《Pro ASP.NET MVC 3 Framework》學習筆記之十六【示例項目SportsStore】

接下進行最後一步了,當使用者填完了Ship資訊時,給使用者顯示一個完結的頁面Summary。右鍵Checkout方法,添加視圖Completed,這裡不用強類型視圖。因為就顯示一個成功資訊而已。代碼如下:

《Pro ASP.NET MVC 3 Framework》學習筆記之十六【示例項目SportsStore】
《Pro ASP.NET MVC 3 Framework》學習筆記之十六【示例項目SportsStore】

好啦,今天的筆記就到這裡。

下一章也是關于該項目的,也是第一部分的最後一章了,正在學習mvc的朋友請一起堅持。到了第二部分,就進入mvc詳細講解部分了,我覺得是最核心的部分,我相信在這個項目裡面我們所有的疑惑和問題都會在第二部分的内容得到答案。你相信嗎?呵呵!

晚安!

繼續閱讀