成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ASP.NET MVC實例:使用Northwind和Entity框架

開發 后端
本文介紹了使用Northwind和Entity框架的ASP.NET MVC實例。

作為asp.net 3.5 Extensions預覽版組成部分的微軟asp.net mvc框架發布了CTP版本。自此,mvc框架就吸引了眾多業界人士的眼球,并紛紛在博客以及各個開發者所關注的網站上進行了介紹。

微軟CLR和.NET框架團隊的成員Brad Abrams發布了一個非常優秀的實例,為開發者展示了如何有效地使用微軟mvc框架中的某些最新工具。該實例源于Scott Guthrie的mvc實例,Scott將這些內容放在他的博客上,演示了在最初形式下的mvc框架是如何進行工作的。Scott的實例采用循序漸進的方式將其編寫為四部分內容:

asp.net mvc框架(第1部分)

asp.net mvc框架(第2部分):URL路徑選擇

asp.net mvc框架(第3部分):從控制器將ViewData傳遞到視圖

asp.net mvc框架(第4部分):處理表單編輯和提交場景

mvc框架為開發者提供了足夠的靈活性去選擇視圖與模型引擎以滿足他們的需要。在Scott的示例中,他使用了LINQ to SQL模型,但Brad決定使用Entity框架,并以Northwind數據庫作為數據源。

開發者可以選擇多種不同的模型提供者,例如:

NHibernate

LINQ to SQL

Entity框架

在將來,我們或許還可以看到其他的模型提供者:

SubSonic

LLBLGen Pro

LightSpeed

或者其他為人所知的

Brad的方法是創建一個實例,引導開發者如何使用asp.net mvc Application and Test創建項目。開發者需要安裝下列內容:

VS2008

asp.net 3.5 Extensions

ADO.NET Entity Framework Tools Dec 07 Preview

Northwind sample database (Northwind.mdf)

ASP.NET MVC實例指南

該指南內容廣泛,有很高的學習價值,從中可以獲知mvc框架的功能以及如何將它們聯系在一起。使用mvc不同于以往所開發的Web Forms應用程序,甚至對于經驗豐富的asp.net Web Form開發人員來說,也需要逐漸地習慣它。

入門

一旦asp.net 3.5 Extensions安裝完畢,就有幾種項目類型可供選擇,其中包括asp.net mvc Web Application以及asp.net mvc Web Application and Test。asp.net mvc被設計為易于測試的框架,而Brad也使用了測試功能。

File/新建項目 - 選擇asp.net mvc Web Application and Test

 File/新建項目 - 選擇asp.net mvc Web Application and Test

它會創建一個單獨的解決方案,包括一個Web應用程序項目,并且,該項目可以用做單元測試。它們都是預先生成的,包含了你需要創建的一些基礎內容。

ASP.NET MVC實例:創建Routes

mvc框架中的Routing(路徑選擇)是設計中非常值得關注的一項功能。開發人員可以通過它判斷應用程序如何查找頁面。在經典的asp.net應用程序中,一個頁面例如home.aspx,總會有一個非常清晰的路徑可以訪問該頁面,通常形如www.mywebsite.com/home.aspx。與此比較,Routing為開發者提供了更多的靈活性。

asp.net mvc提供的其中一個非常強大的新特性是它能夠定制訪問應用程序的URLs。顯然,對于磁盤上的物理文件和用來訪問頁面功能的URL而言,URL路徑選擇特性隔離了兩者之間的關聯關系。這對于搜索引擎的優化以及提高網站的通用性都是非常重要的。例如,現在我們不需要訪問這樣的地址http://localhost/Products/ItemDetails.aspx?item=42,而是通過http://localhost/Products/CodFishOil進行訪問,這樣的URL更讓人賞心悅目。

它的實現是在mvc應用程序的global.asax文件中創建一個路徑表。值得慶幸的是,模板中的默認內容對于應用程序而言已經足夠了。

  1. RouteTable.Routes.Add(new Route  
  2.  
  3. {      
  4.  
  5. Url = "[controller]/[action]/[id]",      
  6.  
  7. Defaults = new { action = "Index", id = (string)null },     
  8.  
  9.  RouteHandler = typeof(mvcRouteHandler)});  
  10.  

這段代碼給出了我們針對自己的站點所需要的URLs格式。特別的,格式為

http://localhost/Products/Details/CodFishOil

的URL應該轉換為ProductsController類(注意,我們為類名添加了“Controller”后綴,使得這些類能夠區別于設計中的模型對象)。接著,Action是Details類的方法,最后,傳遞給details方法的參數為CodFishOil。

當然,還可能有其它的格式,只需要在URL格式的字符串中修改正則表達式即可。

ASP.NET MVC實例:創建模型(Model)

模型是大多數web應用程序的心臟,幾乎所有的數據都存儲在模型之中。mvc框架允許開發者幾乎沒有限制地使用任意一種數據源,并能夠輕松地在各種數據源之間進行切換。

模型表示你將要在應用程序中使用的數據。在本例中,從模型開始應用程序的核心開發是一個不錯的選擇。

將Northwind.mdf文件復制到mvcApplication的App_Data文件夾中。對于SqlServer而言,Northwind可能是最常用的示例數據庫了。你可以從官方地址 中下載它,如果您只需要原始文件的話也可以從這里獲取 。

 如果您只需要原始文件的話也可以從這里獲取

接下來,我們需要基于northwind數據庫創建LINQ模型,以便于進行操作。你可以使用NHibernate 、LinqToSql 、Entity框架 ,或者其它的.NET ORM技術。只要它的返回結果為.NET對象,asp.net mvc框架就能夠對其進行操作。在本例中,我使用了Entity框架。

右鍵單擊Models目錄,選擇add new item

右鍵單擊Models目錄,選擇add new item 

在對話框中,選擇ADO.NET Entity Data Model。

在向導中,選擇“Generate from Database”,然后賦予默認的“Northwnd”連接字符串。

對于演示而言,我們只需要使用Categories、Products和Supplier數據表,當然,你也可以擴展該演示以引入更多豐富的特性集。但是目前除了這三者之外,不要選擇數據庫視圖、存儲過程和其他的數據表。

 當你單擊完成時,VS會創建一組.NET類

當你單擊完成時,VS會創建一組.NET類,這些類定制創建了訪問數據庫的相關內容。我們還能夠獲得一個界面友好的設計器,以可視化方式展現數據之間的關系。

 一個界面友好的設計器,以可視化方式展現數據之間的關系

注意,賦予這些類的默認名仍然沿用了數據庫的復數名詞,但是在我們的OR映射中,它們表達的是單個的實例。為了使得代碼具有可讀性,應該將所有的表名修改為準確的單數名詞:Category、Product和Supplier。至于Product的Navigation屬性,也需要修改為單數形式,因為對于產品而言,只有一個類別(Category)和供應商(Suppler)。

 右擊設計視圖,設置相關的屬性

接下來,我們需要修改命名空間使得代碼更加準確直觀……右擊設計視圖,設置相關的屬性,例如將namespace設置為“NorthwindModels”,將Entity Container的名稱設置為“NorthWindEntities”

將Entity Container的名稱設置為“NorthWindEntities”  

雖然我們沒有給出模型的完整示例,但給出的內容已經足以指導開發者完成剩余的內容……讓我們跳轉到下一個話題,來看一看控制器。

ASP.NET MVC實例:創建控制器

控制器是我們應用程序的大腦。我們可以將控制器想象為機場的空中交通控制器,指揮飛機的進出方向。一方面,控制器負責獲取數據,另一方面,它則負責將數據傳遞到視圖。

右擊Controller目錄,選擇“Add new Item”。在對話框中找到mvc Controller,并確保賦予的名稱是以Controller后綴結尾的。在我們的例子中將會編寫ProductsController類。

在我們的例子中將會編寫ProductsController類  

好的,我們現在從ProductsController.cs開始

控制器的目的是為視圖準備模型對象。我們希望盡可能地將邏輯放到視圖之外,因為它很難在視圖中進行測試。因此,在控制器中,我們會訪問模型,并獲得所有創建完畢的模型,這樣,所有視圖所要做的就是輸出某些數據。

首先,我們需要訪問數據庫。

1. 添加正確的命名空間,包括Linq以及指向我們的OR映射的引用。

  1. using System.Linq;  
  2.  
  3. using NorthwindModel;  

2、接下來,我們需要創建NorthwindEntities容器類的實例。幾乎所有的action都會訪問這個類。

  1. public class ProductsController : Controller  
  2.  
  3. {     
  4.  
  5.  NorthwindEntities Northwind = new NorthwindEntities();  

好的,現在我們需要創建第一個action:顯示所有的類別。記住,控制器的職責是為視圖準備模型對象。在定義一個新的action時,我喜歡首先編寫一條注釋,以提醒我訪問這一功能的URL是什么。

接下來要做的事情就是從模型中訪問Categories。我將結果放到一個泛型集合類中(你可能需要添加System.Collections.Generic引用),然后將結果傳遞到名為“Categories”的視圖中。這是一個非常簡單的例子,后面我們會在此處添加更加復雜的邏輯。

  1. //URL: http://localhost/Products/Categories  
  2.  
  3. [ControllerAction]  
  4.  
  5. public void Categories()  
  6.  
  7. {     
  8.  
  9.  List categories = Northwind.Categories.ToList();      
  10.  
  11. RenderView("Categories", categories);  
  12.  
  13. }  
  14.  

下一步,我們需要創建“Categories”視圖。

ASP.NET MVC實例:創建視圖

對于視圖而言,mvc框架給了開發者和模型差不多的靈活性。開發人員可以選擇一組視圖引擎并對它們進行切換。

右擊Views文件夾,添加新的目錄“Products”。這使得我們可以清晰地組織我們的視圖。右擊Views/Products文件夾,然后添加一個新項mvc View Content Page。我們會充分地利用Master Page,它是在默認的項目中已生成的,可以使得界面看起來更加友好。

右擊Views/Products文件夾,然后添加一個新項mvc View Content Page。  

將該頁面命名為Categories.aspx。視圖的名稱非常重要,它必須與之前提及的RenderView方法的第一個參數相匹配。

默認項目會將Master Page放到Views/Shared/Site.Master中

 默認項目會將Master Page放到Views/Shared/Site.Master中

ViewData是我們要從控制器中傳遞的內容,為了得到對它的強類型訪問,我們需要告知視圖頁面它所期待的類型。這可以通過打開codebehind文件(Categories.aspx.cs),修改繼承的類型來完成:

  1. public partial class Categories : ViewPage  
  2.  
  3. {  
  4.  
  5. }  
  6.  

修改為:

  1. public partial class Categories : ViewPage<  List >   
  2.  
  3. {  
  4.  
  5. }  
  6.  

接著你就可以編寫清晰、簡單、可設計的HTML了。注意,我在這里將所有從ViewData返回的元素項進行了一次循環,然后將它們作為鏈表傳出。我使用了mvc的輔助方法Html.ActionLink,為包含了對應產品ID的List action創建了URL。

  1. < % foreach (var category in ViewData) { %>      
  2.  
  3.  < %= Html.ActionLink(category.CategoryName, new { action="List", id=category.CategoryName }) %>  
  4.  
  5. < % } %>  
  6.  

ASP.NET MVC實例:瀏覽產品

好的,一切準備妥當,可以運行了。

按下F5,導航條上就會出現我們剛才編寫的控制器action:http://localhost:64701/products/Categories

導航條上就會出現我們剛才編寫的控制器action:  

點擊任何一個鏈接都會出現一個錯誤,因為我們還沒有編寫List action。這是我們接下來所要做的。

說句題外話,如果你像我這樣習慣在開發的aspx頁面上使用“View in Browser”,你可能會看到這個錯誤。

若要重現此錯誤,請右擊Categories.aspx,然后選擇View in browser。

 請右擊Categories.aspx,然后選擇View in browser

你會獲得一個錯誤。為什么?是的,請務必謹記在mvc模型中,所有的執行都要經過控制器,視圖自身是不能運行的。未來的工具會對此進行改進,但至少在現在,可以對default.aspx使用F5或者通過“run in browser”進行操作。當然應該首先確保你已經編譯了解決方案。

List Action視圖現在,讓我們回到之前省略的內容:添加List action。在這里我們需要的是在給定的Category中查找所有的產品。首先,我需要從模型中獲取所有產品,然后我必須確保Category的引用已經被加載。Entity框架在默認情況下提供了一個顯式的加載模型。因此,你必須明確地加載你所需要的所有表。最后,我們再呈現視圖。

  1. //example URL:http://localhost:64701/products/List/Confections  
  2.  
  3. [ControllerAction]  
  4.  
  5. public void List(string id)  
  6.  
  7. {     
  8.  
  9.  List products = Northwind.GetProductsByCategory(id);      
  10.  
  11. //prepare the view by explicitly loading the categories        
  12.  
  13. products.FindAll(p => p.Category == null).ForEach(p => p.CategoryReference.Load());      
  14.  
  15. RenderView("ListingByCategory", products);  
  16.  
  17. }  
  18.  

注意,我調用了NorthwindDataContext類的一個自定義方法。我個人傾向于將所有的數據訪問邏輯封裝到這個類中。若要定義該方法,可以右擊Model,通過add new item選擇CodeFile,并命名為NorthwindDataContext.cs,然后給出如下的實現。

  1. using System;  
  2.  
  3. using System.Collections.Generic;  
  4.  
  5. using System.Linq;  
  6.  
  7. namespace NorthwindModel  
  8.  
  9. {     
  10.  
  11.  public partial class NorthwindEntities     
  12.  
  13.  {     
  14.  
  15.  }  
  16.  
  17. }  
  18.  

現在,你可以很容易地為該類添加數據訪問方法了,例如我們之前使用的GetProductsByCategory()方法。

  1. public List GetProductsByCategory(string category)  
  2.  
  3. {      
  4.  
  5. return Products.Where(p => p.Category.CategoryName == category).ToList();  
  6.  
  7. }  
  8.  

下一步,我們需要添加ListingByCategory視圖。遵循前面介紹的相同步驟,我們在Views/Products/目錄下添加ListingByCategory.aspx頁面。

這一次,我們應該讓ViewData成為List類型

  1. public partial class ListingByCategory : ViewPage  
  2.  
  3.  {  
  4.  
  5. }  
  6.  

接下來實現視圖,我們只是對視圖的數據進行了循環,并以正確的格式輸出。

  1. < %--Print out the catagory name--%>   
  2.  
  3.  < % foreach (var product in ViewData) { %>    
  4.  
  5.   < % if (product.Category.CategoryName != null) {  %>     
  6.  
  7.       < %=product.Category.CategoryName  %>      
  8.  
  9.     < % break; %>   < %} //end if %>< %}//end foreach %>  
  10.  
  11. < % foreach (var product in ViewData) { %>    
  12.  
  13.   < img alt="< %=product.ProductName %>" src="/Content/Images/< %=product.ProductID%>.jpg" />    
  14.  
  15.   < %=product.ProductName %>      
  16.  
  17.  Price: < %=String.Format("{0:C2}", product.UnitPrice)%>   
  18.  
  19. < % } %>  
  20.  

一旦你在實例項目中添加了/Content/Images目錄,就會獲得如下頁面:

一旦你在實例項目中添加了/Content/Images目錄,就會獲得如下頁面  

Brad的實例是用C#編寫的,因此Julie Lerman選擇創建了和Brad相似的例子,她使用了VB.NET和AdventureWorksLT數據庫 ,并重點關注了更多高效的Entity框架查詢。Julie指出了她的實現與Brad的重大不同之處。

我的EDM(譯者注:指實體數據模型)創建自AdventureWorksLT數據庫。

在AW(譯者注:AdventureWorksLT的簡寫)中,SalesOrderHeaders和Customer的關系與Northwind中Products和Category的關系相同。因此,在他使用Products的地方,我使用SalesOrderHeaders;在他使用Categories的地方,我使用Customers。

若要輕易地獲取數據并將其傳給視圖,則其中一個關鍵是我們需要傳遞“一個”對象(而且不是匿名類型)到視圖。然而,對于Order列表(每一個都具有Customer的名字)和Details列表(每一個都具有從Order和Customer中獲得的數據)而言,我們真正需要的是一個對象圖。

【編輯推薦】

  1. 在DataBound事件處理中編碼確定數據的值
  2. 使用ASP.NET 2.0 FormView顯示數據
  3. ASP.NET DetailsView中格式化單元格
  4. 如何在DataBound事件中編碼確定數據的值
  5. DetailsView分頁顯示數據

責任編輯:book05 來源: cnblogs
相關推薦

2009-07-24 13:20:44

MVC框架ASP.NET

2009-07-22 13:24:24

ASP.NET MVC

2009-07-22 10:09:59

ASP.NET MVC

2009-07-20 10:53:59

ASP.NET MVC

2009-07-23 15:44:39

ASP.NET MVC

2009-07-22 10:34:37

ActionInvokASP.NET MVC

2009-07-22 13:08:55

拯救UpdatePanASP.NET MVC

2010-06-23 15:44:03

ASP.NET MVC

2014-06-30 09:22:38

ASP.NETBootstrap

2009-03-13 10:58:48

ASP.NetMVC框架編程

2012-06-26 10:24:51

Asp.Net框架Razor

2009-07-28 15:08:50

MVC三層架構實例

2009-07-31 12:43:59

ASP.NET MVC

2009-07-20 12:59:53

ASP.NET MVCASP.NET框架的功

2009-07-20 15:51:40

FubuMVC核心框架ASP.NET MVC

2009-06-01 10:23:31

asp.net mvcasp.net mvc.net mvc框架

2009-07-24 10:55:00

asp.net mvc

2009-07-22 09:36:54

使用UpdataModASP.NET MVC

2009-06-12 09:24:34

ASP.NET窗體ASP.NET MVC

2009-01-03 08:41:51

Ajax無框架的AjaxASP.NET
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级国产精品一级国产精品片 | 亚洲精品黑人 | 中文字幕中文字幕 | 国产亚洲精品久久久优势 | h视频网站在线观看 | 国产一级视频在线观看 | 中文字幕在线视频免费视频 | 国产一级一级 | 91短视频网址 | 精品国产免费一区二区三区演员表 | 精品国产乱码久久久久久图片 | 国产91一区二区三区 | 日韩精品一区二区三区高清免费 | 欧美日韩成人在线 | 激情小视频| 91综合网 | 精品亚洲视频在线 | 巨大黑人极品videos精品 | 91久久精品一区二区二区 | 国产一级在线观看 | 国产黄色大片在线免费观看 | 欧美一级片在线观看 | 国产精品激情在线 | 国产精品视频一区二区三区 | 在线免费亚洲视频 | 日韩精品免费在线 | 天堂中文在线播放 | 欧美亚洲第一区 | 日韩精品一区二区三区中文字幕 | 久久网一区二区三区 | 欧美色视频免费 | 91一区 | 色999视频 | 国产一区二区精品在线观看 | 国产探花在线观看视频 | 国产精品亚洲一区 | 欧美一区二区在线 | av毛片在线播放 | 亚洲精选一区二区 | 国产精品一区二区三区在线 | 欧美日本久久 |