時間和篇幅所限,MVC不會介紹基本的建站過程,請參照博客園技術專題文章 傳送門 英語足夠好的請直接去微asp.net 官網 傳送門 (強烈推薦,尤其是想使用最新技術的時候更應該直接去官網),本文主要介紹什么呢?就像高中的時候你在做數學題,有地方不會了,去看看參考答案怎么玩的,對!本文目標就做這個,做一個參考答案一樣的東西。告訴大家這些東西怎么用,最好在什么時候用的經驗。
(挖坑1)有朋友問建站后部署的問題,將在本章最后講解,我會提出兩個發布方式一個操作簡單的【本地文件】,一個絕對便利的【web deploy】。
這一節主要講解一些我使用mvc將近一年所遇到的坑與項目中的活用方法以及一些進階意見。
Asp.net MVC本質上還是Asp.NET,熟悉它的管道機制,他如何將request轉化成response等等問題將會對整個項目拓展有極大的幫助。博客園有相應文章,請大家自行搜索,這里就不重復造輪子了。
關於網站架構問題,我是挺老一批寫asp.net網站的人(雖然我年齡不大。。。),從微軟當初的一個三層架構的demo開始就一直在研究架構問題,反復琢磨過馬丁大叔的《企業應用架構模式》,對於架構的意見就是,不要過度架構。多大的活多大的架構,有的甚至三層都用不上。沒有必要在細化若干層去。我曾在codeproject看過一個通訊錄項目,拋出為了展示DDD架構理念這一目的,就是典型在過度架構了。個人團隊崇尚敏捷開發,如果是足夠了解Asp.NET MVC內在運行機理,那你會發現很多的地方可以拓展使用完全沒必要把造輪子這種活動放到自己的身上。在這里推薦蔣金楠先生的《ASP.NET MVC 4框架揭秘》(我不是書拖,這本書也不適合初學者),不喜歡看實體書的去他的博客傳送門。講解的很深入不過需要一定編程功底。
閑話少說,本節干貨開始
1》使用分部視圖增加網站重用性
請看最下面的圖,單品拍賣,主題拍賣,最新動態都是分布式圖,而在項目中我最常用的兩種創建分布式圖的方法是
//Action參數為視圖名稱 ,調用子操作返回一段HTML代碼 @Html.Action("PartialNewRank") //Partial,不走Controller里面的Action,直接對應物理文件 @Html.Partial("_Page")
這兩個具體在項目中怎么用呢
1)Partial這個方法可以做一些只需要靜態HTML代碼就可以完成的動作,比如整個頁面最下方的
2)Action這個方法適合做一些頁面內容不固定需要從數據庫里面取數據在渲染到頁面上的地方
比如下面這個最新排行,主題拍賣這些都是從一個【子方法】中拿到的html代碼段添加到主頁面上來的。
注1:)單品拍賣是瀑布流,使用的是Ajax,(挖坑2)有朋友說希望知道Ajax在項目中是怎么用的,這章后面小節會介紹
注2:)@Html.Action顧名思義,必然要在controller里面有一個Action函數,和你正常寫一個View視圖是一樣的。只不過返回的時候要使用PartialView()這個方法,當然是用View()也是可以的
public ActionResult Test() { //做業務處理,從數據庫讀數據 return PartialView(); }
注3:)這兩個方法都可以傳參數的
//就像這樣 @Html.Action("NewDynamic", new { id=100}) @Html.Partial("_Page", new { id=100})
那有朋友就要問了,Partial方法不是不能走Action么,那怎么接受參數呢,方法就是強類型在頁面頭上寫強類型
@model string <div> id是@Model 是的沒錯,還能這樣。。。 </div>
ok第一個問題講完。下一個干貨
2》在項目中使用Razor
我記得微軟一位MVP在Codeproject上講了一個段子,我在四處找Razor的語法教程,不過最后我發現原來它不需要教程。是的,這句話沒錯,他不需要系統的教程,你只需要知道每個頁面可以有一個Model就哦了。然后想用什么加一個‘@’標識符就可以寫C#代碼,使用”@{這里寫c#代碼}“來標識一段C#代碼,代碼段可以出現在任何位置,並且可以和HTML混寫,但是 坑 來了 ,一件藝術品10000元,頁面上展示 “人與森林10000元” 代碼可能是這樣的:注1)Art是一個class,里面有一個屬性Price
人與森林@Model.Art.Price元
對不起,Razor引擎不識別他會把"Price元"作為一個整體當成Art的一個屬性,怎么辦?
填坑1》Price與元之間打一個空格,代碼如下
人與森林@Model.Art.Price 元
ok,ok完全可以,這下Razor不能把"Price元"作為一個整體了,不過頁面展示的時候也會有一個空格,會變成這樣“人與森林10000 元”。
這么看好像沒問題,做大作業好像沒人會挑,一切都很好了。不過,為什么不這么干
填坑2》使用"@(expression)"綁定一個表達式,代碼是這樣的
人與森林@(Model.Art.Price)元
good!圓滿解決,一切都和諧了。
3》Razor中使用using引入類庫
做過分頁的同學應該都會知道Webdiyer,一般回在項目里面這么寫通過using引入分頁的dll
@using Webdiyer.WebControls.Mvc @model PagedList<AuctionStationAdmin.Modules.Bll.Derivative> @{ Layout = "~/Views/Shared/_Layout.cshtml"; } <div>內容展示</div> @*分頁*@ <div style="text-align:center; margin-left:-2em;"> @Html.Pager(Model, new PagerOptions { HorizontalAlign = "center", ShowFirstLast = false, CssClass = "pagination pagination-lg", NavigationPagerItemWrapperFormatString = "<li>{0}</li>", ContainerTagName = "ul", PageIndexParameterName = "id", ShowPageIndexBox = false, PrevPageText = "<<", NumericPagerItemCount = 5, Id = "pages", NextPageText = ">>", CurrentPagerItemWrapperFormatString = "<li class=\"active\"> <a>{0}</a> </li>", NumericPagerItemWrapperFormatString = "<li> {0}</li>", }, new { style = "margin-top:2em;margin-bottom:2em" }) </div>
但是你可以這樣在每個View下面都有一個Web.config
里面有這樣一段
<system.web.webPages.razor> <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <pages pageBaseType="System.Web.Mvc.WebViewPage"> <namespaces> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Optimization"/> <add namespace="System.Web.Routing" /> <add namespace="AuctionStation.Web" /> <add namespace="Webdiyer.WebControls.Mvc" /> </namespaces> </pages> </system.web.webPages.razor>
注意到了沒,<add namespace="Webdiyer.WebControls.Mvc" />,這么一來就不需要在每個需要分頁的View里面寫using了。
注1)你需要再添加完上面的代碼后將這個View文件夾里面的打開在編輯的頁面都關掉,重新打開才會識別添加進去的namespace
時間不多本次先寫到這里,感謝各位捧場。本章回下一節將會繼續挖坑填坑。祝各位好運。
----from,Yeanzhi