天天看點

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

接下來是關于SportsStore的背景管理功能,也就是通常的CRUD操作。

首先添加一個AdminController,代碼如下:

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

View Code

我們通過一個List page來展示已有的products,接着在AdminController裡面添加一個Action:

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

為我們的背景管理界面建立一個布局_AdminLayout.cshtml,在 Views/Shared上右鍵添加新項MVC 3 Layout Page

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

接着添加一個樣式表單Admin.css,如下所示:

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

添加Index視圖:

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

這裡對資料庫有改動,需要增加一個字段ImageURL(varchar(255)),并且在我們的SportsStore.WebUI項目新添加一個檔案夾UploadImgs用來存放上傳的圖檔。

編輯Product

建立一個Edit Action

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

建立Edit View,強類型的并引用了_AdminLayout.cshtml,

如下:

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

如果運作程式,這裡并不會顯示ProductID,因為這裡沒有必要顯示出來。實作這個效果需要在Product實體裡面使用模型中繼資料(model metedata)。它能讓我們應用Attributes到Product的屬性上面來影響Html.EditorForModel()方法輸出的布局。

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

HiddenInput特性讓MVC架構将該屬性作為隐藏表單元素呈現,DataType特性允許我們指定一個值怎樣顯示或編輯。如這裡将Description顯示為MultilineText(多行文本)

這裡需要添加一個引用System.Web.Mvc。

接着添加一些樣式到Admin.css裡面,如下:

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

這裡看發現css裡面的類名如.editor-field,我們并沒有在View裡面定義一個class屬性,這個是MVC架構生成的,你可以檢視頁面源檔案。而且ID都是屬性名,這是模型綁定的結果,在前面的筆記有這些内容的。

為了編輯Product,我們需要添加相應的Repository和接口。在IProductsRepository裡面添加一個方法:void SaveProduct(Product product);

接着實作該接口,如下:

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

初次路過的朋友可能會驚訝這裡是什麼東東,書中用的EF架構+MS SQL Server。我學着用的是iBatisnet+MySQL。如果你對iBatisnet不了解,可以先用下iBatisnet,上手還算比較容易。你也可以看看我前面筆記之十二,裡面講了我這裡的使用情況。

這裡我們需要在iBatisnet的映射檔案Product.xml添加update語句,如下:

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

接着在AdminController裡面重載一個處理HTTP Edit請求的action方法,如下:

當驗證通過,會執行儲存。這裡我使用了TempData存儲了一條提示資訊,TempData是MVC架構提供的一個非常爽的功能。它是一個Dictionary的鍵值對,類似于Session和ViewBag。有一個關鍵的不同點是TempData會在HTTP請求結束被删除。

從上面的代碼我們注意下Edit方法的傳回值類型ActionResult.前面我使用大多是ViewResult。ViewResult是從ActionResult派生的,當我們想呈現一個View時就可以使用ViewResult的傳回值類型。當然,ActionResult的其他類型也是可用的,其中一個就是RedirectToAction方法的傳回值類型。

這裡我們不能使用ViewBag,因為使用者被重定向了,ViewBag在Controller和View傳遞資料并且ViewBag儲存資料的時間不會比目前的Http請求,也就是說可能在Http請求沒有結束時ViewBag裡面資料已經丢失了,這就達不到我們要的效果。當然Session可以儲存,但是Session會一直儲存(除非伺服器記憶體不足或是過期),直到我們顯示的移除它,當然我們不情願這樣做。MVC架構提供的TempData功能就很完美的符合這裡顯示提示資訊的要求。而且TempData裡面的資料是限制在單個使用者會話裡面的(使用者之前是不能互相檢視對方的TempData),并且會一直儲存知道我們讀取了以後才被删除。我們将會在使用重定向到使用者的action方法呈現View時讀取TempData的資料。

接着我們在_AdminLayout裡面使用TempData,為的是能夠在引入了_AdminLayout的是以View裡面使用。修改_AdminLayout.cshtml的代碼如下:

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

上面我們引入了幾個js檔案是用來進行用戶端驗證的,這又是MVC架構提供給我們的一個非常爽的功能,我隻需要在Product.cs裡面為屬性添加我需要限制的Attributes就能夠實作驗證使用者輸入的目的,引入了上面的兩個js檔案後,預設是開啟了用戶端驗證的。當然伺服器端驗證是一定會有的。在大多數情況下,我們都希望進行用戶端驗證,因為這樣會有一個比較好的使用者體驗。

但是如果我們不想進行用戶端驗證則可以這樣做,則可以使用這兩句代碼:

HtmlHelper.ClientValidationEnabled = false;

HtmlHelper.UnobtrusiveJavaScriptEnabled = false;

如果我們将這兩句代碼放到一個View或Controller裡面,那用戶端驗證對目前的Action就不會使用。

我們也可以如果在配置檔案裡面配置來禁止整個程式使用用戶端驗證,如下配置:

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

接着我們實作建立一個新的Product,添加兩個Create() action方法,一個是Get請求(沒有加HttpGet Attribute表示預設Get),一個是處理HttpGet請求。我們呈現添加頁面的時候調用的是Get,送出時調用Post。在AdminController裡面添加的代碼如下:

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

接着右鍵添加Create.cshtml,代碼如下:

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

實作删除Product操作

首先添加一個接口方法:void DeleteProduct(Product product);

接着實作該方法

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

關于iBatisnet的映射檔案,在上面已經全部列出來了,是以這裡就不在展示了。接着是建立Delete action方法,如下:

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

接着實作背景管理的安全性設定

asp.net mvc是建立在asp.net核心平台上的,是以我們可以通路asp.net form驗證的功能,這也是一個比較通用的功能。隻有登入成功的人才能操作背景。關于From驗證,在書的22章會詳細講解。這裡隻是介紹了最基本的配置。在配置檔案裡面添加如下代碼:

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

MVC架構有一個非常強大的功能稱為filters。這些都是Attributes,應用到一個action方法或Controller類。當一個請求被處理的時候,這些Attributes引入了額外的邏輯。我們也可以定義自己的filter。

這部分内容會在13章詳細介紹的,這裡大概知道就行。其實我了解這裡就是,filter功能用來實作權限控制,哪些action是需要權限的,隻允許哪些使用者方法的等等。當添加了這些filter後,處理請求的時候就會做額外的判斷。

我們這裡隻是用到了Authorize。我們在AdminController類的上面添加這個filter,如下所示:

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

這樣就表示隻有通過驗證的才可能通路該Controller,當然我可以細化到針對一個action方法。

這個時候運作程式,通過/Admin/Index URL進行背景會報錯,因為并不存在Account/LogOn.

下面我們開始實作登入驗證功能,在Infrastructure檔案夾裡面再建立一個Abstract檔案夾,在該檔案夾裡面添加一個接口IAuthProvider,代碼如下:

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

接着在Infrastructure檔案夾裡面再建立一個Concrete檔案夾,添加一個實作類FormsAuthProvider.如下:

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

然後使用Ninject添加綁定,如下:

接着建立一個AccountController和LogOn action方法,實際上是重載的兩個LogOn方法,一個處理Get呈現,一個處理Post送出驗證。這之前我們需要建立一個view model來傳遞。在SportsStore.WebUI/Models裡面添加一個新的類LogOnViewModel,代碼如下:

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

接着我們添加AccountController,如下:

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

右鍵添加LogOn View,如下:

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

到這裡,整個項目就結束了,呵呵!通過這個項目對MVC的了解應該加深了,後面進入到第二部分MVC3架構的講解。因為項目後面對資料庫進行了更改,是以你需要自己在相關的View裡面添加顯示圖檔的代碼。如果你是按照我的筆記實際操作,遇到任何問題請及時留言!

好了,今天的筆記就到這裡,祝大家周末愉快!公司如果這幾天有年會的,祝大家都有好運中獎!