版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持1文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.個人鍵入文檔標(biāo)題鍵入文檔副標(biāo)題鍵入作者姓名2010-6-17Asp .Net MVC 概述原文鏈接:/mvc/1.ASP.NET MVC 概覽模型-視圖-控制器(Model-View-Contoller,MVQ架構(gòu)模式將應(yīng)用程序分為了三個主要的組件:模型,視圖和控制器。ASP.NETMVC框架為ASP.NETWeb表單模式提供了另一種開發(fā)模式一一 基于MVC的Web應(yīng)用程序。ASP.NETMVC框架是一個輕量的、高度可測試的表現(xiàn)層框架(與基于 表單的Web應(yīng)用程序相同),它繼承在了現(xiàn)有
2、的 ASP.NET功能之中,例如模板頁和基于 Membership 的驗證。MVC框架定義在了,并且是必不可少的,由部分System.Web命名空間支持。MVC是一個許多開發(fā)者都熟悉的、標(biāo)準(zhǔn)的設(shè)計模式。一些類型的Web應(yīng)用程序?qū)?MVC框架中受益。其他一些應(yīng)用程序?qū)^續(xù)使用基于Web表單和Postback的傳統(tǒng)ASP.NET應(yīng)用程序模式。還有一些 Web應(yīng)用程序?qū)⑦@兩種方法結(jié)合;這兩種方式互不排斥。MVC框架包含下面的組件:圖1 :調(diào)用一個需要參數(shù)值的控制器動作模型:模型對象是應(yīng)用程序中實現(xiàn)了數(shù)據(jù)領(lǐng)域(data domain )邏輯的部分。通常,模型對文檔來源為 :從網(wǎng)絡(luò)收集整理 .w
3、ord 版本可編輯 .歡迎下載支持2文檔來源為 :從網(wǎng)絡(luò)收集整理 .word 版本可編輯 .本系列文章主要從控制器、視圖和數(shù)據(jù)模型這3個Asp.Net MVC基礎(chǔ)組建來講解。象從數(shù)據(jù)庫中獲取模型狀態(tài), 并且將模型狀態(tài)保存至數(shù)據(jù)庫。 舉個例子, 一個 Product 對象可能 從數(shù)據(jù)庫中獲取信息,對它進(jìn)行操作,然后將更新后的信息寫回 SQL Server 中的 Products 表。在小型的應(yīng)用程序中,模型通常是一個概念上的劃分而非一個實際的劃分。舉個例子,如 果應(yīng)用程序只是讀取 DataSet 然后發(fā)送給視圖, 應(yīng)用程序沒有一個實際的模型層和相關(guān)的類。 在 這種情況下, DataSet 就承擔(dān)
4、了模型對象的角色。視圖:視圖是應(yīng)用程序中顯示用戶界面(UI)的組件。典型地,這個UI基于模型數(shù)據(jù)創(chuàng)建。舉個例子, Products 表的編輯視圖基于 Products 對象的狀態(tài)顯示了文本框、下拉列表,以及復(fù) 選框??刂破鳎?控制器是處理用戶交互的組件,它與模型協(xié)作,并且最終選擇一個要呈現(xiàn)的視圖 來顯示用戶界面。 在MVC應(yīng)用程序中,視圖僅僅顯示信息; 控制器處理并且響應(yīng)用戶輸入和交互。 舉個例子, 控制器處理查詢字符串值, 并且將這些值傳遞給模型, 模型再使用這些參數(shù)查詢數(shù)據(jù) 庫。MVC莫型幫助創(chuàng)建這樣的應(yīng)用程序,它能夠?qū)?yīng)用程序的各個方面區(qū)分開(輸入邏輯、業(yè) 務(wù)邏輯,以及 UI 邏輯),同
5、時提供這些元素之間的松耦合。這個模式指定了每一種邏輯應(yīng)該位 于應(yīng)用程序的哪個位置。 UI 邏輯屬于視圖。輸入邏輯屬于控制器。業(yè)務(wù)邏輯屬于模型。這種分 隔有助于你在創(chuàng)建應(yīng)用程序時管理復(fù)雜性,因為它能夠讓你在一次將精力集中于實現(xiàn)的某一方 面。舉個例子,你可以集中在視圖,而不依賴于業(yè)務(wù)邏輯。除了管理復(fù)雜性以外,測試應(yīng)用程序時MVC模式比基于Web表單的ASP.NET應(yīng)用程序要簡單得多。舉個例子,在一個基于Web表單的ASP.NET應(yīng)用程序中,一個類既用于顯示輸岀,也用于響應(yīng)用戶輸入。 為基于 Web表單的ASP.NET應(yīng)用程序編寫自動測試程序是很復(fù)雜的,因為要測試每個頁面,你必須初始化頁面類,它的所
6、有子控件,以及應(yīng)用程序中其他有所依賴的類。因為為了運(yùn)行頁面初始化了這么多的類,所以編寫專用于應(yīng)用程序單獨(dú)部分的測試就變得很困難了。測試基于 Web表單的ASP.NET應(yīng)用程序因此比測試 MVC應(yīng)用程序更加難以實施。 除此以外,基于 Web表單的ASP.NET應(yīng)用程序需要一個 Web服務(wù)器。MVC框架將組件進(jìn)行了解耦,并且大量使用 了接口,使得測試獨(dú)立于框架其他部分的組件成為可能。MVC應(yīng)用程序三個主要組件之間的松耦合也提升了并行開發(fā)的程度。舉個例子,一個開發(fā) 者可以開發(fā)視圖, 第二個開發(fā)者可以開發(fā)控制器邏輯, 而第三個開發(fā)者可以將精力集中于模型中 的業(yè)務(wù)邏輯。1.1決定如何創(chuàng)建MVC應(yīng)用程序你
7、必須認(rèn)真考慮是使用 ASP.NET MVC框架實現(xiàn) Web應(yīng)用程序,還是使用 ASP.NET Web表單 模型來實現(xiàn) Web應(yīng)用程序。MVC框架并沒有取代 Web表單模型;你可以選擇使用 MVC框架(如果 你已經(jīng)有基于Web表單的應(yīng)用程序,它們可以繼續(xù)像往常一樣工作)。對于一個特定的 Web站點(diǎn),在你決定使用 MVC框架或者 Web窗體模型之前,權(quán)衡一下每一 種方式的優(yōu)勢。1.1.1基于MVC勺Web應(yīng)用程序的優(yōu)勢文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持3文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.ASP.NET MVC框架提供了下面的優(yōu)點(diǎn):?通過將應(yīng)用程序分為了模型、
8、視圖和控制器,它在管理復(fù)雜性方面更加的簡單。?它不適用視圖狀態(tài)或者基于服務(wù)器的表單。對于那些想要完全控制應(yīng)用程序行為的開發(fā)者來說,MVC框架是很理想的。?通過一個控制器,它使用了Front Controller模式來處理對Web應(yīng)用程序的請求。這允許你設(shè)計岀一種可以支持豐富的路由結(jié)構(gòu)的應(yīng)用程序。關(guān)于Front Co ntroller的更多信息,可以查看 MSDN網(wǎng)站。?它為測試驅(qū)動開發(fā)(test-driven development, TDD)提供了更好的支持。?對于那些由大型開發(fā)者和設(shè)計者所支持的Web應(yīng)用程序來說,它運(yùn)作得很好,能夠?qū)?yīng)用程序的行為提供更高層次的控制。1.1.2 基于Web
9、窗體的Web應(yīng)用程序的優(yōu)勢基于Web窗體的框架提供了下面的優(yōu)勢:?它支持在HTTP上保存狀態(tài)的事件模型,這有益于lin e-of-bus in ess的Web應(yīng)用程序開發(fā)?;赪eb窗體的應(yīng)用程序提供了大量的事件,它們被數(shù)以百計的服務(wù)器控件 所支持。?它使用了一個 Page Controller模式來為單個頁面添加功能。關(guān)于Page Controller的更多信息,可以參考 MSDN網(wǎng)站。?它使用了視圖狀態(tài)或者基于服務(wù)器的表單,這使得管理狀態(tài)信息更加容易。?對于那些想要利用大量的用于快速應(yīng)用程序開發(fā)組件的小型Web開發(fā)者和設(shè)計者團(tuán)隊來說,它工作得很好。?總的來說,對于應(yīng)用程序開發(fā)來說,它更加的
10、簡單,因為組件(Page類,控件等)已經(jīng)緊密地集成了,并且通常比MVC需要編寫更少的代碼。1.2 ASP.NET MVC框架的功能ASP.NET MVC框架提供了下面的功能:?應(yīng)用程序任務(wù)的分離(輸入邏輯、業(yè)務(wù)邏輯和用戶界面邏輯),可測試性,以及默認(rèn) 的測試驅(qū)動開發(fā)。MVC框架中的所有核心契約都是基于接口的,并且可以使用mock對象進(jìn)行測試,mock對象是模擬的對象,它們可以模仿應(yīng)用程序中實際對象的行為。 你可以對應(yīng)用程序進(jìn)行單元測試,而不需要在ASP.NET進(jìn)程中運(yùn)行控制器,這使得單元測試更快速也更靈活。?它是一個可擴(kuò)展和可插入的框架。ASP.NET MVC框架的組件設(shè)計為可以很容易地替換或
11、者定制。你可以嵌入你自己的視圖引擎、URL路由策略、動作方法參數(shù)序列化,以及其他組件。ASP.NET MVC框架也支持使用依賴注入(Depe ndency Injection , DI)和控件倒置(In version of Co ntrol,IOC)容器模型。DI允許你將對象注入文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持4文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.到類中,而不是基于類來創(chuàng)建對象本身。IOC制定了如果一個對象需要另一個對象,第一個對象應(yīng)該由外部源,例如配置文件,獲得第二個對象。這使得測試更加容易。? 一個強(qiáng)大的URL映射組件,允許你創(chuàng)建擁有著易于理解和便
12、于搜索的URL的應(yīng)用程序。URL并不需要包含文件名擴(kuò)展,并且設(shè)計為有利于搜索引擎優(yōu)化(SEO和表現(xiàn)狀態(tài)傳輸(representational state transfer)的 URL命名模式。?支持在現(xiàn)有的 ASP.NET頁面(.aspx文件)、用戶控件(.ascx文件)和模板頁(.master 文件)文件中使用標(biāo)記來作為視圖模板。你可以與ASP.NET MVC框架一起使用現(xiàn)有的ASP.NET功能,例如嵌套模板頁,in-line 表達(dá)式(%,聲明式服務(wù)器控件、 模板、數(shù)據(jù)綁定、本地化等等。?支持現(xiàn)有的 ASP.NET功能。ASP.NET MVC允許你使用例如表單驗證和Windows驗證、URL
13、授權(quán)、成員資格和角色、輸出和數(shù)據(jù)緩存、會話和檔案狀態(tài)管理、健康監(jiān)視器、 配置系統(tǒng)和Provider架構(gòu)這些ASP.NET的功能。2. 理解MVC應(yīng)用程序執(zhí)行過程對基于ASP.NET MVC勺Web應(yīng)用程序發(fā)岀的請求首先通過UrlRoutingModule 對象,它是一個Http模塊。這個模塊對請求進(jìn)行解析,并且執(zhí)行路由選擇。UrlRoutingModule 對象選擇與當(dāng)前請求所匹配的第一個路由對象(路由對象十一哥實現(xiàn)了RouteBase的類,典型地是是一個 Route類的實例)。如果沒有路由匹配,UrlRout in gModule 對象什么也不做,并且讓請求回退到通常的Asp.Net或者II
14、S請求處理。從所選擇的 Route對象中,UrlRoutingModule 對象獲取與 Route對象相關(guān)的IRouteHandler 對象。典型地,在一個MVC應(yīng)用程序中,這是一個MvcRouteHandler的實例。IRouteHandler 實例創(chuàng)建了一個IHttpHa ndler 對象,并且向它傳遞 IHttpC on text對象。默認(rèn)情況下,MVC的IHttpHandler 實例是一個 MvcHandler對象。MvcHandler對象然后選擇控制器,該控制器最終處理請求。NOTE當(dāng)ASP.NET MVC應(yīng)用程序運(yùn)行在IIS7.0中時,MVC項目對文件的擴(kuò)展名沒有要求。 然而,在I
15、IS6.0 中,handler要求你將.mvc文件名后綴映射到 ASP.NET ISAPI DLL。模塊和處理器(handler )是ASP.NET MVC框架的入口點(diǎn)。它們執(zhí)行下面的動作:?在MVC Wet應(yīng)用程序中選擇合適的控制器。?獲取一個特定的控制器實例。?調(diào)用控制器的Execute方法。下面的表列岀了 MVC Web項目的執(zhí)行階段。階段細(xì)節(jié)收到應(yīng) 用程序在Global.asax 文件中,Route對象添加到RouteTable對象中。文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持5文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.的第一 個請求執(zhí)行路由UrlRouting
16、Module模塊使用RouteTable集合中的第一個匹配的Route對象來創(chuàng)建RouteData對象,該對象然后被用來創(chuàng)建 RequestContext (IHttpContext )對象。創(chuàng)建MVC青 求處理 器MvcRouteHandler對象創(chuàng)建一個 MvcHandler類的實例,并且將 RequestContext實例傳遞給它。創(chuàng)建控制器MvcHa ndler對象使用RequestC on text實例來識別出 ICon trollerFactory對象(典型地,是一個DefaultC on trollerFactory類的實例),來創(chuàng)建控制器實例。調(diào)用動作大多數(shù)控制器都繼承自Con
17、 troller基類。對于這些控制器來說,與 控制器相關(guān)的ControllerActionlnvoker對象決定調(diào)用控制器類的哪一個動作方法,然后調(diào)用它。執(zhí)行結(jié) 果一個典型的動作方法可能會接收用戶輸入,準(zhǔn)備合適的響應(yīng)數(shù)據(jù),然 后通過返回一個結(jié)果類型來執(zhí)行結(jié)果。內(nèi)置的、可以執(zhí)行的結(jié)果包括 下面這些:ViewResult (呈現(xiàn)一個視圖,是最常使用的結(jié)果類型), RedirectToRouteResult、RedirectResult、ContentResult、 JsonResult 和 EmptyResult。3. 理解模型、視圖和控制器這篇教程將為你提供 ASP.NET MVC模型、視圖、控
18、制器的高層次概覽。換言之,它解釋了 ASP.NET MVC中的“ M”、 “ V” 和“ C”。在讀完本教程之后,你應(yīng)該能夠理解ASP.NET MVC應(yīng)用程序中的各個不同部分是如何一起工作的。你也應(yīng)該能夠理解ASP.NETMVC應(yīng)用程序與ASP.NETWeb窗體應(yīng)用程序和動態(tài)服務(wù)器頁面應(yīng)用程序在構(gòu)架上有何不同。3.1范例ASP.NET MVC應(yīng)用程序Visual Studio 用于創(chuàng)建 ASP.NET MVC Web應(yīng)用程序的默認(rèn)模板包括了一個極其簡單的范 例應(yīng)用程序,可以使用它來理解 ASP.NETMVC應(yīng)用程序的各個部分。我們將會在這篇教程中利用 這個簡單的應(yīng)用程序。你可以通過啟動 Vis
19、ual Studio2008,并且在菜單中選擇File (文件)”、“ NewProject (新建項目)”來使用 MVC模板創(chuàng)建一個新的 ASP.NETMVC應(yīng)用程序(如圖1)。在“新建項目 文檔來源為 :從網(wǎng)絡(luò)收集整理 .word 版本可編輯 .歡迎下載支持6文檔來源為 :從網(wǎng)絡(luò)收集整理 .word 版本可編輯 .對話框,在項目類型下選擇你喜歡的編程語言( Visual Basic 或者C#),并且在模板下選擇 ASP.NET MVC Web應(yīng)用程序。點(diǎn)擊“確定”按鈕。圖 1 - 新建項目對話框當(dāng)你創(chuàng)建一個新的 ASP.NETMVC應(yīng)用程序時,將會岀現(xiàn)“創(chuàng)建單元測試項目( Create U
20、nit Test Project )”對話框(如圖 2)。這個對話框允許你在解決方案下創(chuàng)建一個獨(dú)立的項目用于 測試你的 ASP.NET MVC應(yīng)用程序。選擇選項 No, do not create a unit test project(否,不要創(chuàng)建單元測試項目)”,并且點(diǎn)擊“0K (確定)”按鈕。圖 2 - 創(chuàng)建單元測試對話框在新的ASP.NET MVC應(yīng)用程序創(chuàng)建好之后。你將會在解決方案瀏覽器窗口中看到幾個文件 夾和文件。特別地,你將會看到三個文件夾,名字是 Models 、Views 和 Controllers 。正如你從 文件夾的名稱可以推測岀的,這三個文件夾包含了實現(xiàn)了模型、視圖和控
21、制器的文件。如果你展開 Controller 文件夾, 你應(yīng)該會看到一個命名為 HomeController.cs 的文件。 如 果你展開Views文件夾,你應(yīng)該看到兩個子文件夾,名稱是Home和Shared。如果你展開 Home文件夾,你將會再次看到兩個文件,名稱是About.aspx和Home.aspx (見圖3)。這些文件組成了這個包含在默認(rèn) ASP.NET MVC模板中的范例應(yīng)用程序。圖 3 - 解決方案瀏覽器窗口你可以通過選擇菜單項 Debug (調(diào)試)、“ Start Debugging(啟動調(diào)試)來運(yùn)行這個范例應(yīng)用程序。除此以外,你可以點(diǎn)擊 F5 鍵。當(dāng)你第一次運(yùn)行 ASP.NE
22、T應(yīng)用程序,將會岀現(xiàn)圖4中的對話框,建議你開啟調(diào)試模式。點(diǎn)擊“確定”按鈕將會運(yùn)行應(yīng)用程序。圖 4 - 未開啟調(diào)試對話框當(dāng)你運(yùn)行一個 ASP.NET MVC應(yīng)用程序,Visual Studio會在你的web瀏覽器中運(yùn)行應(yīng)用程序。這個范例應(yīng)用程序只含有兩個頁面: Index 頁面和 About 頁面。當(dāng)應(yīng)用程序第一次啟動時, 將會顯示 Index 頁面(見圖 5)。你可以通過點(diǎn)擊應(yīng)用程序右上角的菜單鏈接導(dǎo)航到About 頁面。圖 5 - Index 頁面注意一下你瀏覽器地址欄中的 URJ當(dāng)你點(diǎn)擊Home菜單鏈接,瀏覽器地址欄的URL將變?yōu)?Home。當(dāng)你點(diǎn)擊 About菜單鏈接,瀏覽器地址欄的UR
23、L變?yōu)?About。3.2 一個URL并不等同于一個頁面當(dāng)你創(chuàng)建一個傳統(tǒng)的 ASP.NETWeb窗體應(yīng)用程序,或者是一個動態(tài)服務(wù)器頁面(ASP)應(yīng)用程序,在URL與頁面之間存在一對一的對應(yīng)。如果你請求服務(wù)器上的一個名為SomePage.aspx的頁面, 那么最好在磁盤上有一個 SomePage.aspx 頁面。 如果 SomePage.aspx 文件并不存在, 你 將會獲得一個丑陋的 404- 頁面不存在錯誤 。文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持7文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.當(dāng)創(chuàng)建一個ASP.NET MVC應(yīng)用程序時則大不相同,你鍵入到瀏覽器地址欄
24、的URL與你應(yīng)用程序中的文件之間并沒有一個對應(yīng)關(guān)系。在一個ASP.NETMVC應(yīng)用程序中,一個 URL與一個控制器的動作相對應(yīng),而不是磁盤上的頁面。對于一個傳統(tǒng)的 ASP.NET或者ASP應(yīng)用程序,瀏覽器請求被映射到了頁面。在ASP.NETMVC應(yīng)用程序中,瀏覽器請求被映射到了控制器動作。一個ASP.NETWeb窗體應(yīng)用程序是以內(nèi)容為中心的。而一個 ASP.NET MVC應(yīng)用程序則以是應(yīng)用程序邏輯為中心的。3.3理解URL路由一個瀏覽器請求通過名叫URL路由(URLRouting )的ASP.NETMVC功能被映射到了一個控制器動作。URL路由將即將到來的請求發(fā)送到了控制器動作。URL路由使用
25、一張路由表來處理來到的請求。這個路由表在你的Web應(yīng)用程序首次啟動時創(chuàng)建。這個路由表建立在Global.asax 文件中。代碼清單 1包含了這個默認(rèn)的 MVCGIobal.asax文件。代碼清單 1 - Glabal.asaxpublic classGlobalApplicati onpublic static void RegisterRoutes(RouteCollectio n routes)routes.Ig noreRoute(resource.axd/*pathl nfo);routes.MapRoute(Default ,co ntroller/actio n/id,new co
26、n troller =Home, acti on = I ndex, id = );protected void Applicatio n Start()RegisterRoutes(RouteTable.Routes);文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持8文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.當(dāng)ASP.NET應(yīng)用程序第一次啟動時,將調(diào)用Application_Start()方法。在代碼清單 1中,這個方法調(diào)用了 RegisterRoutes() 方法,并且RegisterRoutes()方法創(chuàng)建了默認(rèn)的路由表。默認(rèn)的路由表只含有一個路由。這個默認(rèn)的路由將所
27、有到來的請求分為了三個分段(一個 URL分段是正斜杠之間的任何東西)。第一個分段映射到了控制器名稱,第二個分段映射到了動 作名稱,最后一個分段映射到了傳遞給動作的名為Id的參數(shù)。例如,考慮下面的URL:/Product/Details/3這個URL將會被解析為像這樣的三個部分:Con troller = ProductC on trollerActi on = DetailsId = 3注意到Controller后綴被添加到了控制器參數(shù)的末尾。這只是MVC勺一個怪癖而已。默認(rèn)的路由包含所有三個分段的默認(rèn)值。默認(rèn)的控制器是HomeC on troller ,默認(rèn)的動作是Index,默認(rèn)的Id是一
28、個空字符串。 腦子里記下這三個默認(rèn)值,考慮下面的URL是如何被解析的:/Employee這個URL將被解析為像這樣的三個參數(shù):Con troller = EmployeeC on trollerActi on = In dexId =最后,如果你打開一個ASP.NETMVC應(yīng)用程序而不提供任何的URL(例如,然后這個URL將會被解析成這樣:Con troller = HomeC on trollerActi on = In dexId =這個請求被發(fā)送到了HomeController 類的Index()動作文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持9文檔來源為:從網(wǎng)絡(luò)收集整理
29、.word版本可編輯.3.4理解控制器控制器負(fù)責(zé)用戶與 MVC應(yīng)用程序交互的方式。當(dāng)用戶發(fā)岀瀏覽器請求時,控制器決定向用 戶發(fā)回什么樣的響應(yīng)??刂破鞑贿^是一個類(例如,一個Visual Basic 或者C#類)。這個范例 ASP.NET MVC應(yīng)用程序包含一個名為HomeCo ntroller.cs的控制器,它位于 Con trollers 文件夾下。HomeController.cs的內(nèi)容再次顯示在了代碼清單2中。代碼清單 2 - HomeConroller.csusing System;usi ng ;using System.L inq;using System.Web;usi ng ;
30、namespace MvcApplication1.Controllerspublic classHomeC on troller: Con trollerpublic Acti on Result In dex()ViewDataTitle =Home Page;ViewDataMessage =Welcome to ASP.NET MVC! ;return View();public Actio nResult About()ViewDataTitle =About Page ;return View();注意到HomeController 擁有兩個方法,名為Index()和About()
31、。這兩個方法對應(yīng)于控制器暴露岀的兩個動作。URL /Home/Index 將會調(diào)用 HomeController.lndex()方法,而 URL/Home/About 會調(diào)用 HomeController.About()方法。控制器中的任何公共方法都被暴露為一個控制器動作。對此你需要多加小心。這就意味著 包含在控制器中的任何公共方法都可以由任何可以訪問互聯(lián)網(wǎng)的人調(diào)用,通過在瀏覽器中輸入正確的URL文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持10文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.3.5理解視圖由HomeController 類暴露岀的兩個控制器動作,Index()和
32、About(),都返回了一個視圖視圖含有將會發(fā)送給瀏覽器 HTML標(biāo)記和內(nèi)容。當(dāng)使用 ASP.NET MVC應(yīng)用程序時,一個視圖等同 于一個頁面。你必須在正確的位置創(chuàng)建你的視圖。HomeCo ntroller. In dex()動作返回了一個位于以下路徑的視圖:ViewsHomel ndex.aspxHomeCo ntroller.About()動作返回一個位于以下路徑的視圖:ViewsHomeAbout.aspx一般而言,如果你想為一個控制器動作返回一個視圖,那么你需要在Views文件夾下創(chuàng)建一個子文件夾,這個文件夾與你的控制器同名。在子文件夾下,你必須創(chuàng)建一個.aspx文件,它的名字與控制
33、器動作相同。代碼清單3中的文件含有 About.aspx視圖。代碼清單 3 - About.aspxv% Page Lan guage=C# MasterPageFile=/Views/Shared/Site.MasterAutoEventWireup=true CodeBehind= Inherits=%About UsTODO: Put about content here.如果你忽略代碼清單中的第一行,視圖剩余的大部分是由標(biāo)準(zhǔn)的HTML構(gòu)成的。你可以在這里輸入任何你想要的HTML來修改視圖的內(nèi)容。視圖非常類似于動態(tài)服務(wù)器頁面(ASP)中的頁面,或者 ASP.NET的Web窗體。視圖可以含
34、有HTML內(nèi)容和腳本。你可以使用你所喜愛的.NET語言(例如,C#或者Visual Basic .Net )編寫腳本。你使用腳本顯示動態(tài)的內(nèi)容,例如數(shù)據(jù)庫數(shù)據(jù)。3.6理解模型我們已經(jīng)討論了控制器,我們也討論了視圖。我們需要討論的最后一個話題是模型。MVC模型是什么呢?文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持11文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.MVCI勺模型包含了你應(yīng)用程序中的所有邏輯,這些邏輯沒有包含在視圖或者控制器中。模 型應(yīng)該包含你的應(yīng)用程序中的所有業(yè)務(wù)邏輯和數(shù)據(jù)庫訪問邏輯。例如,如果你使用LINQ to SQL訪問數(shù)據(jù)庫,那么你可以在Models文件夾
35、中創(chuàng)建你的 LINQ to SQL類(你的dbml文件)。視圖應(yīng)該僅包含與生成用戶界面有關(guān)的邏輯??刂破鲬?yīng)該僅僅只包含最少量的邏輯,用于 返回正確的視圖或者將用戶重定向到另一個動作。任何其他的事情都應(yīng)該包含在模型中。通常,你應(yīng)該竭盡全力創(chuàng)建一個豐富的模型以及一個瘦小的控制器。你的控制器方法應(yīng)該 只包含幾行代碼。如果一個控制器動作變得太豐富,那么你應(yīng)該考慮將這些邏輯抽取出來放置到Models文件夾的新類中。3.7總結(jié)這篇教程為你提供了 ASP.NET MVC Web應(yīng)用程序各個不同部分的一個高層次的概覽。你學(xué) 習(xí)了 URL路由如何將即將到來的瀏覽器請求發(fā)往特定的控制器動作。你還學(xué)習(xí)了控制器是如何
36、協(xié)調(diào)視圖怎樣返回瀏覽器的。最后,你學(xué)習(xí)了模型是怎樣包含應(yīng)用程序的業(yè)務(wù)和數(shù)據(jù)庫訪問邏輯的。Asp .Net MVC 控制器原文鏈接:/mvc/這篇教程探索了 ASP.NET MVC控制器(controller)、控制器動作(controller action )和動作結(jié)果(action results )這幾個主題。在讀完本篇教程之后,你將會理解控制器如何控制 訪問者與ASP.NET MVC網(wǎng)站進(jìn)行交互的方式。1. 理解控制器MVC空制器負(fù)責(zé)響應(yīng)對 ASP.NET MVC網(wǎng)站發(fā)起的請求。每一個瀏覽器請求都映射到了一個 專門的控制器。舉個例子,設(shè)想一下你在瀏覽器地址欄輸入了下面的URL:在這種情況
37、下,將會調(diào)用一個名為ProductCo ntroller的控制器。ProductCo ntroller負(fù)責(zé)生成對瀏覽器請求的響應(yīng)。舉個例子,控制器可能會返回一個特定的視圖,或者是將用戶重定向到另一個控制器。你可以通過在ASP.NET MVC應(yīng)用程序的Co ntrollers文件夾下添加一個新的控制器來創(chuàng)建一個新控制器。右鍵點(diǎn)擊控制器的文件夾,并且選擇菜單項“ Add (添加)”,“ New(新建項)并選擇“ MVCControllerClass (MVC控制器類)”(見圖1)??刂破鞯拿直仨毢蠧ontroller后綴。舉個例子,控制器名稱ProductController 沒什么問題,但是
38、控制器Product就不起作用圖1 -創(chuàng)建一個新的控制器如果你創(chuàng)建一個新的名為ProductCo ntroller的控制器,那么你將會獲得代碼清單1所示文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持12文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.的文件。代碼清單 1 - ProductController.csusing System;usi ng ;using System.L inq;using System.Web;usi ng ;namespace MvcApp.Controllerspublic class ProductCo ntroller: Con troll
39、erpublicActi on Result In dex()/ Add acti on logic herethrow new NotImpleme ntedExceptio n();如同你在代碼清單 1中所看到的,控制器不過是一個類(Visual Basic.Net 或者是C#類)My Tasks. display ing all tasksAdd new Task現(xiàn)在Index.aspx 視圖并沒有顯示任何的任務(wù)-它只是聲明它將會顯示。在這個教程后面,我們將會為In dex.aspx頁面添加一些腳本來顯示任務(wù)列表。注意到Index.aspx 視圖含有標(biāo)為“Add new task ”的鏈
40、接。這個鏈接指向到了 /Home/Create 路徑。當(dāng)你點(diǎn)擊這個鏈接,HomeController的Create()動作將會被調(diào)用。Create()方法返回Create 視圖。Create.aspx視圖含有一個用于創(chuàng)建新任務(wù)的表單。這個視圖的內(nèi)容包含在清單3中:清單 3 - Create.aspxAdd New Task文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持38文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.Task:v/label文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持39文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.這個 URL對應(yīng)于 Home
41、Controller v/formv/div注意到清單3中包含的表單提交到了下面的URL:/Home/CreateNew.aspx控制器中的CreateNew()動作。代表著新任務(wù)的表單數(shù)據(jù) 將會提交到這個動作。1.5創(chuàng)建數(shù)據(jù)庫下一步是創(chuàng)建含有任務(wù)的數(shù)據(jù)庫。你可以通過在App_Data文件夾上點(diǎn)擊右鍵,并且選擇菜單項,“添加(Add)”、“新建項(New Item )”來創(chuàng)建數(shù)據(jù)庫。選擇“ SQL Server數(shù)據(jù)庫” 模板項,將數(shù)據(jù)庫命名為 TaskListDB.mdf ,并且點(diǎn)擊“添加(Add)”按鈕。接下來,我們需要向數(shù)據(jù)庫中添加一張含有任務(wù)的表。在解決方案瀏覽器窗口中雙擊TaskLis
42、tDB.mdf以打開服務(wù)器瀏覽器窗口。右鍵點(diǎn)擊“表”文件夾,并且選擇“添加新表(AddNew Table )”菜單項。選擇這個菜單項將會打開數(shù)據(jù)庫表設(shè)計器。創(chuàng)建下面的數(shù)據(jù)庫列:列名數(shù)據(jù)類型是否允許NULLIdIntFalseTaskNVarchar(300)FalseIsCompletedBitFalseEn tryDateDateTimeFalse第一列,Id列,有兩個特殊的屬性。首先,你需要將Id標(biāo)記為主鍵列。在選擇Id列之后,點(diǎn)擊設(shè)置主鍵(Set Primary Key )按鈕(這是一個看上去像鑰匙的圖標(biāo))。第二步,你需 要將Id列標(biāo)記為標(biāo)識列(IdentityColumn)。在列屬性窗
43、口,向下滾動到標(biāo)識詳細(xì)信息(IdentitySpecification)” 一節(jié)并展開它。將是否為標(biāo)識( Is Identity )”值改為 Yes。當(dāng)你做完這些以后,表格將會如圖4所示。圖4. Tasks 表格最后一步是保存這個新的表格。點(diǎn)擊“保存( Save) ”按鈕(軟盤的圖標(biāo))并且將新表格 命名為Tasks。文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持40文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.1.6創(chuàng)建模型一個MVC模型包含了你的應(yīng)用程序和數(shù)據(jù)庫訪問的大部分邏輯。通常,你可以將包含在 MVC應(yīng)用程序中的大部分類都放在Models文件夾中。你的應(yīng)用程序中所有沒有
44、包含在視圖或者控制器的邏輯都被推向了Models文件夾。在這篇教程中,我們將會使用LINQ to SQL來與我們上一小節(jié)創(chuàng)建的數(shù)據(jù)庫通信。就我自己而言,我喜歡LINQ to SQL然而,并不要求你一定在 ASP.NETMVC應(yīng)用程序中使用 LINQ to SQL 如果你愿意,你可以使用其他的技術(shù),例如NHibernate或者Entity Framework來與數(shù)據(jù)庫進(jìn)行通信。為了使用LINQ to SQL,我們必須首先在 Models文件夾中創(chuàng)建我們的LINQ to SQL類。右鍵點(diǎn)擊Models文件夾,選擇“添加”、“新建項”菜單項,并且選擇“LINQ to SQL Classes ”模板項
45、。將你新建的LINQ to SQL類命名為TaskList.dbml并且點(diǎn)擊“添加(Add)”按鈕。在你完成這一步驟之后,將會顯示對象關(guān)系設(shè)計器(Object Relatio nal Desig ner )。我們需要創(chuàng)建一個 LINQ to SQL實體類,它代表了我們的Tasks數(shù)據(jù)庫表。將 Tasks數(shù)據(jù)庫表從解決方案瀏覽器窗口拖曳到對象關(guān)系設(shè)計器中。執(zhí)行完最后這一個動作,將會創(chuàng)建一個新的名為Task的LINQ to SQL實體類(參看圖 5)。點(diǎn)擊“保存(Save)”按鈕(軟盤的圖標(biāo)) 以保存這個新的實體。圖5 - Task 實體1.7向控制器方法中添加數(shù)據(jù)庫邏輯現(xiàn)在我們已經(jīng)擁有了數(shù)據(jù)庫,
46、我們可以修改我們的控制器動作,以便從數(shù)據(jù)庫中存儲和獲 取任務(wù)。修改后的HomeController 包含在清單4中。清單 4 - HomeController.csusing System;usi ng ;using System.L inq;using System.Web;usi ng ;using TaskList.Models;namespace TaskList.Controllers public classHomeC on troller: Con troller privateTaskListDataC on textdb = new TaskListDataC on text
47、();/顯示任務(wù)列表publicActio nResult In dex() var tasks = from tin db.Tasksorderby t.E ntryDatedesce nding select t;文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持41文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.return View(tasks.ToList();/顯示創(chuàng)建新任務(wù)的表單 public Actio nResult Create() return View();/向數(shù)據(jù)庫中添加一個新任務(wù)public Action Result CreateNew(stringde
48、scription) Task newTask = new Task ();n ewTask.Descripti on = descripti on;n ewTask.lsCompleted =false ;n ewTask.E ntryDate = DateTime.Now;db.SubmitCha nges();return RedirectToActio n(I ndex );/將任務(wù)標(biāo)記為任務(wù)publicAction Result Complete(int Id) /數(shù)據(jù)庫邏輯var tasks = from tin db.Tasks where t.Id = Id select t;
49、foreach (Task match in tasks)match.IsCompleted =true ;db.SubmitCha nges();retur nRedirectToActi on(I ndex );注意到清單 4中的HomeController 含有一個類級(class-level )的私有字段,名為db。這個db字段是一個TaskListDataContext類的實例。HomeController類使用db字段來代表TaskListDB 數(shù)據(jù)庫。Index()控制器的動作已經(jīng)被修改為獲得所有來自Tasks數(shù)據(jù)庫表的記錄。tasks被傳遞到了 Index視圖中。CreateN
50、ew()方法被修改為在 Tasks數(shù)據(jù)庫表中創(chuàng)建一個新的任務(wù)。注意到CreateNew()方法已經(jīng)被修改為接受一個名為description的字符串參數(shù)。這個參數(shù)代表著由Create視圖傳遞文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持42文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.進(jìn)來的description文本表單字段。ASP.NETMVC匡架自動將表單字段作為參數(shù)傳遞給控制器動作。最后,Complete。務(wù)標(biāo)記為已完成,任務(wù)的方法被修改為更改 Tasks數(shù)據(jù)庫表的IsComplete列的值。當(dāng)你將一個任 Id被傳遞給Complete。動作,并更新數(shù)據(jù)庫。1.7 修改 I
51、ndex視圖為了完成我們的 TaskList應(yīng)用程序,我們還必須再做最后一件事。我們必須修改Index視圖,以便它能夠顯示所有任務(wù)的列表,并且允許我們將某一任務(wù)標(biāo)記為已完成。修改過的Index視圖包含在了清單 5中。清單 5 - Index.aspxv% Page Lan guage=C# AutoEve ntWireup=true CodeBehi nd=In herits= % In dexMy Tasks-ahref=/Home/Complete/Complete- 文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持43文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.Add n
52、ew Task v/div在清單5中的Index視圖含有一個 C# foreach循環(huán),它遍歷了所有的任務(wù)。這些任務(wù)由 ViewData.Model屬性所表示。概括來講,你使用 ViewData來將數(shù)據(jù)從控制器傳遞到視圖。在循環(huán)體內(nèi)部,有一個條件判斷用來檢查任務(wù)是否已完成。一個已完成的任務(wù)使用一個穿 過它的橫線(刪除線)來表示。HTML的標(biāo)簽用來創(chuàng)建橫穿已完成任務(wù)的橫線。如果這個任務(wù)還沒有完成,將在任務(wù)旁邊顯示一個標(biāo)記為Complete的鏈接。這個鏈接由下面的腳本創(chuàng)建:a href=/Home/Complete/Complete注意到任務(wù)的Id被包含在由鏈接所表示的 URL中。當(dāng)你點(diǎn)擊鏈接時,
53、這個任務(wù) Id將會傳 遞到HomeController 類的Complete。動作中。通過這種方式,當(dāng)你點(diǎn)擊Complete鏈接時,將會更新正確的數(shù)據(jù)庫記錄。Index視圖的最終版本所顯示的頁面位于圖6中。圖6 - Index視圖1.8總結(jié)這篇教程的目的是讓你體驗一下創(chuàng)建一個ASP.NET MVC應(yīng)用程序的經(jīng)過。我希望你會發(fā)現(xiàn)創(chuàng)建一個ASP.NET MVC Wet應(yīng)用程序與創(chuàng)建一個動態(tài)服務(wù)器頁面(ASP)或者ASP.NET應(yīng)用程序的經(jīng)歷非常類似。在這篇教程中,我們只考察了 ASP.NET MVC框架中最基本的一些功能。在后續(xù)的教程中, 我們將會更加深入到一些主題,例如控制器、控制器動作、視圖、
54、視圖數(shù)據(jù)和HTML helper中Asp.Net MVC(理解模型、視圖和控制器)-Part.2原文鏈接:/mvc/tutorial-02-cs.aspx這篇教程將為你提供 ASP.NET MVC模型、視圖、控制器的高層次概覽。換言之,它解釋了 ASP.NET MVC中的“ M”、“ V” 和“ C”。在讀完本教程之后,你應(yīng)該能夠理解ASP.NET MVC應(yīng)用程序中的各個不同部分是如何一起工作的。你也應(yīng)該能夠理解ASP.NETMVC應(yīng)用程序與ASP.NETWeb窗體應(yīng)用程序和動態(tài)服務(wù)器頁面應(yīng)用程序在構(gòu)架上有何不同。文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持44文檔來源為:從網(wǎng)
55、絡(luò)收集整理.word版本可編輯.1. 范例 ASP.NET MVC 應(yīng)用程序Visual Studio 用于創(chuàng)建 ASP.NET MVC Web應(yīng)用程序的默認(rèn)模板包括了一個極其簡單的范 例應(yīng)用程序,可以使用它來理解 ASP.NETMVC應(yīng)用程序的各個部分。我們將會在這篇教程中利用 這個簡單的應(yīng)用程序。你可以通過啟動 Visual Studio2008 ,并且在菜單中選擇“ File (文件)”、 “ NewProject (新建項目)”來使用 MVC莫板創(chuàng)建一個新的 ASP.NETMVC應(yīng)用程序(如圖1)。在“新建項目對話框,在項目類型下選擇你喜歡的編程語言(Visual Basic 或者C#
56、),并且在模板下選擇ASP.NET MVC Web應(yīng)用程序。點(diǎn)擊“確定”按鈕。圖 1 - 新建項目對話框當(dāng)你創(chuàng)建一個新的 ASP.NETMVC應(yīng)用程序時,將會岀現(xiàn)“創(chuàng)建單元測試項目( Create Unit Test Project )”對話框(如圖 2)。這個對話框允許你在解決方案下創(chuàng)建一個獨(dú)立的項目用于 測試你的 ASP.NET MVC應(yīng)用程序。選擇選項 No, do not create a unit test project(否,不要創(chuàng)建單元測試項目)”,并且點(diǎn)擊“0K (確定)”按鈕。圖 2 - 創(chuàng)建單元測試對話框在新的ASP.NET MVC應(yīng)用程序創(chuàng)建好之后。你將會在解決方案瀏覽器
57、窗口中看到幾個文件 夾和文件。特別地,你將會看到三個文件夾,名字是Models 、Views 和 Controllers 。正如你從文件夾的名稱可以推測岀的,這三個文件夾包含了實現(xiàn)了模型、視圖和控制器的文件。如果你展開 Controller 文件夾, 你應(yīng)該會看到一個命名為 HomeController.cs 的文件。 如 果你展開Views文件夾,你應(yīng)該看到兩個子文件夾,名稱是Home和Shared。如果你展開 Home文件夾,你將會再次看到兩個文件,名稱是About.aspx和Home.aspx (見圖3)。這些文件組成了這個包含在默認(rèn) ASP.NET MVC模板中的范例應(yīng)用程序。圖 3
58、- 解決方案瀏覽器窗口你可以通過選擇菜單項Debug (調(diào)試)、“ Start Debugging(啟動調(diào)試)來運(yùn)行這個范例應(yīng)用程序。除此以外,你可以點(diǎn)擊 F5 鍵。當(dāng)你第一次運(yùn)行 ASP.NET應(yīng)用程序,將會岀現(xiàn)圖4中的對話框,建議你開啟調(diào)試模式。點(diǎn)擊“確定”按鈕將會運(yùn)行應(yīng)用程序。圖 4 - 未開啟調(diào)試對話框當(dāng)你運(yùn)行一個 ASP.NET MVC應(yīng)用程序,Visual Studio會在你的web瀏覽器中運(yùn)行應(yīng)用程序。這個范例應(yīng)用程序只含有兩個頁面: Index 頁面和 About 頁面。當(dāng)應(yīng)用程序第一次啟動時, 將會顯示 Index 頁面(見圖 5)。你可以通過點(diǎn)擊應(yīng)用程序右上角的菜單鏈接導(dǎo)航
59、到About 頁面。圖 5 - Index 頁面注意一下你瀏覽器地址欄中的URJ當(dāng)你點(diǎn)擊Home菜單鏈接,瀏覽器地址欄的URL將變?yōu)?Home。當(dāng)你點(diǎn)擊 About菜單鏈接,瀏覽器地址欄的URL變?yōu)?About。文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.歡迎下載支持45文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編輯.2. 一個URL并不等同于一個頁面當(dāng)你創(chuàng)建一個傳統(tǒng)的 ASP.NETWeb窗體應(yīng)用程序,或者是一個動態(tài)服務(wù)器頁面(ASP應(yīng)用程序,在URL與頁面之間存在一對一的對應(yīng)。如果你請求服務(wù)器上的一個名為SomePage.aspx的頁面,那么最好在磁盤上有一個SomePage.aspx
60、頁面。如果SomePage.aspx文件并不存在, 你將會獲得一個丑陋的 404-頁面不存在錯誤。當(dāng)創(chuàng)建一個ASP.NET MVC應(yīng)用程序時則大不相同,你鍵入到瀏覽器地址欄的URL與你應(yīng)用程序中的文件之間并沒有一個對應(yīng)關(guān)系。在一個ASP.NETMVC應(yīng)用程序中,一個 URL與一個控制器的動作相對應(yīng),而不是磁盤上的頁面。對于一個傳統(tǒng)的 ASP.NET或者ASP應(yīng)用程序,瀏覽器請求被映射到了頁面。在ASP.NETMVC應(yīng)用程序中,瀏覽器請求被映射到了控制器動作。一個ASP.NETWeb窗體應(yīng)用程序是以內(nèi)容為中心的。而一個 ASP.NET MVC應(yīng)用程序則以是應(yīng)用程序邏輯為中心的。3. 理解URL路
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版房屋代持業(yè)務(wù)合同范本3篇
- 二零二五版電機(jī)維修智能化改造合同范本3篇
- 二零二五年度房地產(chǎn)經(jīng)紀(jì)服務(wù)合同7篇
- 二零二五版購房借款及房地產(chǎn)開發(fā)商風(fēng)險控制擔(dān)保服務(wù)合同3篇
- 二零二五版商業(yè)地產(chǎn)買賣合同模板下載3篇
- 二零二五年度高等教育機(jī)構(gòu)外國專家項目合作合同參考書3篇
- 二零二五版家用空調(diào)安裝與室內(nèi)環(huán)境改善合同3篇
- 二零二五年度成都上灶師父招聘與餐飲業(yè)人才服務(wù)合同2篇
- 展會創(chuàng)意展示合同(2篇)
- 2025年度油氣田2#配電房土建安裝與防爆電氣設(shè)備合同3篇
- 下肢皮牽引護(hù)理PPT課件(19頁P(yáng)PT)
- 臺資企業(yè)A股上市相關(guān)資料
- 電 梯 工 程 預(yù) 算 書
- 參會嘉賓簽到表
- 機(jī)械車間員工績效考核表
- 形式發(fā)票格式2 INVOICE
- 2.48低危胸痛患者后繼治療評估流程圖
- 人力資源管理之績效考核 一、什么是績效 所謂績效簡單的講就是對
- 山東省醫(yī)院目錄
- 云南地方本科高校部分基礎(chǔ)研究
- 廢品管理流程圖
評論
0/150
提交評論