天天看點

購物車Demo,前端使用AngularJS,後端使用ASP.NET Web API(2)--前端,以及前後端Session

chsakell分享了前端使用AngularJS,後端使用ASP.NET Web API的購物車案例,非常精彩,這裡這裡記錄下對此項目的了解。

文章:

http://chsakell.com/2015/01/31/angularjs-feat-web-api/

http://chsakell.com/2015/03/07/angularjs-feat-web-api-enable-session-state/

源碼:

https://github.com/chsakell/webapiangularjssecurity

本系列共三篇,本篇是第二篇。

<a href="http://www.cnblogs.com/darrenji/p/4959623.html" target="_blank">購物車Demo,前端使用AngularJS,後端使用ASP.NET Web API(1)--後端</a>

<a href="http://www.cnblogs.com/darrenji/p/4959694.html" target="_blank">購物車Demo,前端使用AngularJS,後端使用ASP.NET Web API(2)--前端,以及前後端Session</a>

<a href="http://www.cnblogs.com/darrenji/p/4959721.html" target="_blank">購物車Demo,前端使用AngularJS,後端使用ASP.NET Web API(3)--Idetity,OWIN前後端驗證</a>

HomeController用來展示首頁面,并接受前端傳來的Order的編号。

Home/Index.cshtml視圖。

以上,ng-hide="checkoutComplete()"決定着是否顯示所在div,ng-show="data.error" 決定是否顯示報錯,&lt;ng-view /&gt;根據路由顯示不同視圖,ng-cloak用來避免在切換視圖時頁面的閃爍,&lt;cart-details&gt;&lt;/cart-details&gt;是自定義的directive,和angularjs有關的js檔案放在頂部,applicaiton相關js檔案放在其下面,在mainApp.js檔案中坐落着一個頂級module名稱是gadgetStore,而頂級controller被放在了gadgetsStoreCtrl.js這個js檔案中了。

最終的界面如下:

購物車Demo,前端使用AngularJS,後端使用ASP.NET Web API(2)--前端,以及前後端Session

main.js 聲明頂級module,以及配置路由。

storeFilters, storeCart是我們自定義的,這裡注入進來。

有了gadgetsStore這個module,現在就為這個module添加controller等。

以上,為gadgetsStore這個module定義了常量以及controller。把一些規定的uri定義成某個moudule的常量是很好的習慣。通過$location.path方法可以擷取或設定目前視窗的uri。

好了,頂級的module和頂級的controller有了,Gadget部分如何顯示呢?

根據路由$routeProvider.when("/gadgets",{templateUrl: "app/views/gadgets.html"}), Gadget的視圖被放在了app/views/gadgets.html中了,來看gadgets.html這個視圖。

以上,把視圖的來源交給了gadgetsCtrl這個controller, 這個controller也被定義在了gadgetsStore這個module中。

gadgetsCtr.js

在顯示Gadget清單的時候,&lt;div ng-repeat="item in data.gadgets | filter: categoryFilterFn | filter: searchItem | range:selectedPage:pageSize"&gt;,這裡用到了一個自定的過濾器range,這個過濾器被定義在了storeFilters.js中。

再來看$routeProvider.when("/checkout",{templateUrl: "app/views/checkout.html"});這個路由,checkout.html這個部分視圖如下:

對應的界面如下:

購物車Demo,前端使用AngularJS,後端使用ASP.NET Web API(2)--前端,以及前後端Session

cartDetailsController這個controller也被放在了頂級module裡。如下:

我們注意到,我們已經在多個地方注入cart這個服務 ,這個自定義的服務可以以factory的方式來建立,如果要用這個cart服務,它所在的module就要被其它module所引用。下面來建立cart服務:

關于購物車部分,我們還記得,在主視圖用了&lt;cart-details&gt;&lt;/cart-details&gt;這個自定義的directive,實際也是在storeCart這個module中定義的。

以上,對應的視圖為:

在顯示購物車明細的時候,給出了送出訂單的連結:

&lt;a href="#/submitorder"&gt;Place order now&lt;/a&gt;

根據路由$routeProvider.when("/submitorder",{templateUrl: "app/views/submitOrder.html"}),是會加載app/views/submitOrder.html部分視圖,界面如下:

購物車Demo,前端使用AngularJS,後端使用ASP.NET Web API(2)--前端,以及前後端Session

對應的html為:

sendOrder被定義在了頂級module中:

/complete會路由到$routeProvider.when("/complete",{templateUrl: "app/views/orderSubmitted.html"}), app/views/orderSubmitted.html部分視圖如下:

購物車Demo,前端使用AngularJS,後端使用ASP.NET Web API(2)--前端,以及前後端Session

其html部分為:

■ 實作購物車的Session

現在為止,還存在的問題是:當重新整理頁面的時候,購物車内的産品就會消失,即還麼有Session機制。

與ASP.NET Web API路由相關的HttpControllerRouteHandler, HttpControllerHandler, IRequireSessionState。

首先一個繼承内置的HttpControllerHandler,并實作内置的IRequiresSessionState接口。

然後實作一個内置HttpControllerRouteHandler的繼承類。

注釋掉WebApiConfig.cs中的代碼:

在RouteConfig中配置如下:

以上,需要引用System.Web.Http。

現在,如果希望ItemsController中使用Session,那就這樣請求:

http://localhost:61691/api/sessions/items

如果不想用Session,那就這樣請求:

http://localhost:61691/api/items

現在,在前端,向購物車添加産品相關代碼為:

類似地,建立一個模型:

對應的控制器為:

再回到前端,首先在gadgetsStore這個頂級module中增加有關緩存API的uri常量。

重新定義cart這個服務:

為了在頁面每次重新整理的時候保證Session的狀态,在主module中添加如下方法:

然後checkSessionGadgets這個方法就要被運用到主視圖上去,當頁面每次加載的時候調用它。

每次向購車添加的時候需要重新更新後端的Session狀态。

每次從購物車一處的時候需要重新更新後端的Session狀态。

在使用者送出訂單的時候,需要一出購物車内的産品,再更新後端的Session狀态。

待續~~

繼續閱讀