MVC項目開發中那些用到的知識點(MvcContrib分離ASP.NET MVC項目)

來源:互聯網
上載者:User

前言

在http://www.cnblogs.com/aehyok/archive/2013/04/07/3006438.html這篇隨筆中,我簡單的介紹了,asp.net mvc3.0中內建的Areas的使用。本次主要進行擴充,來講一下,在開發後期項目中用的MvcContrib來對項目進行分離,比如最簡單的分離Web項目,前台和後台。

MvcContrib可以將一個MVC項目裡的所有內容(包括Views,Controllers,Scripts等)都編譯到一個dll裡面。如此一來,該MVC項目就可以作為一個“外掛程式(或組件)/Plugin(or Widget)”為其他項目使用,具有很強的重用性。

 

正題  

  1.首先建立一個ASP.NET MVC3.0項目MyPortable(前台項目),項目模板選擇Internet Application,視圖引擎選擇Razor。

  2.然後再在解決方案中添加另外一個ASP.NET MVC3.0項目MyPortable.Admin(後台項目),項目模版選擇空項目,視圖引擎還是選擇Razor。

  3.在MyPortable.Admin項目上面右鍵,添加一個類AdminAreaRegistration.cs並輸入以下內容:

public class AdminAreaRegistration : AreaRegistration{    public override string AreaName    {        get        {            return "Admin";        }    }     public override void RegisterArea(AreaRegistrationContext context)    {        context.MapRoute(            "Admin_default",            "Admin/{controller}/{action}/{id}",            new { action = "Index", id = UrlParameter.Optional }        );                }}

  4.可以使用NuGet為MyPortable.Admin安裝MvcContrib:

當然你也可以在官網直接下載http://mvccontrib.codeplex.com/,下載後解壓檔案清單如下

主要就是在MyPortable.Admin下引用MvcContrib.dll檔案即可。

5.開啟AdminAreaRegistration.cs,然後將其基類AreaRegistration修改為PortableAreaRegistration,將RegisterArea方法聲明修改為:

public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus)

並為為預設路由加上命名空間限制,並且在RegisterArea方法中加入RegisterAreaEmbeddedResources()。現在看起來應該是這樣子:  

        public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus)        {            context.MapRoute(                "Admin_default",                "Admin/{controller}/{action}/{id}",                new { action = "Index", id = UrlParameter.Optional },                new string[]{"MyPortable.Admin.Controllers"}            );        }

以及在住項目Global.asax.cs檔案中修改

        public static void RegisterRoutes(RouteCollection routes)        {            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");            routes.MapRoute(                "Default", // 路由名稱                "{controller}/{action}/{id}", // 帶有參數的 URL                new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // 參數預設值                new string[] {"MyPortable.Controllers"}            );        }

  

 6 在MyPortable.Admin/Controllers下面添加一個HomeController和Index的Action,並且添加相應的View檔案.

namespace MyPortable.Admin.Controllers{    public class HomeController : Controller    {        //        // GET: /Home/        public ActionResult Index()        {            return View();        }    }}

 7. 將所有的css,js,image靜態檔案的屬性-產生操作(Build Action)選擇“內嵌資源(Embedded Resources)”。

這意味著這些靜態檔案都將被編譯進dll檔案裡面,而不是像之前那樣,以單獨物理檔案存在。這樣做的好處是整個項目裡面的結構都是相對固定的,一個dll就包括了整個工程裡的所有內容,可複用性高。缺點是每次修改了這個項目裡的內容(即便是修改js或view等靜態內容),也必須要重新編譯整個項目。這就要看個人的取捨了,你可以權衡這樣做是否值得。

8.在主專案裡面引用Admin項目。在主專案裡面添加一個叫做Areas的檔案夾,並將MyPortable/Views/Web.config複製到建立的Areas檔案夾下。

為什麼需要這樣做呢?這是因為Admin項目裡的Portable Area在被主專案載入時,會被映射到這個Areas檔案夾裡,此時Controller就會在Areas下面去尋找對應的Views(而不是在主專案裡尋找)視圖。

9.編譯運行查看效果即可。

 當然也可以訪問靜態檔案.在AdminAreaRegistration.cs檔案添加相應的路由

           context.MapRoute(                "ResourceRoute",                base.AreaRoutePrefix + "/resource/{resourceName}",                new { controller = "EmbeddedResource", action = "Index" },                new[] { "MvcContrib.PortableAreas" }            ); 

 

這段路由的意思是將所有的靜態資源都交給MvcContrib.PortableAreas.EmbeddedResource去處理,因此現在我們可以使用:/Admin/resource/Scripts.jquery-1.5.1.min.js來訪問jquery。注意其中的“Scripts.jquery-1.5.1.min.js”中間是“.”而不是“/”。

在View視圖中,還可以用<%= Url.Resource("Scripts.jquery-1.5.1.min.js") %>的訪問形式。Url.Resource()方法整合在MvcContrib中。

通過這種方式,我們可以完全控製程序集中的所有靜態內嵌資源,如果想通過訪問物理檔案的方式訪問內嵌資源,可以添加如下路由:

//Scriptscontext.MapRoute(    AreaName + "_Scripts",    base.AreaRoutePrefix + "/Scripts/{resourceName}",    new { controller = "EmbeddedResource", action = "Index", resourcePath="Scripts" },    new[] { "MvcContrib.PortableAreas" });//Contentcontext.MapRoute(    AreaName + "_Content",    base.AreaRoutePrefix + "/Content/{resourceName}",    new { controller = "EmbeddedResource", action = "Index", resourcePath = "Content" },    new[] { "MvcContrib.PortableAreas" });

  

總結

  通過MvcContrib Portable Area我們可以將MVC項目進行有效分離,並且使用內嵌資源的方式,將整個分離出來的項目編譯成一個dll,可以隨意複製引用,可重用性較好。

但是,這種方式也存在以下不足之處:

  1. 由於所有靜態資源都被編譯到dll中,這就不可避免造成dll的體積變得越來越大,尤其在圖片比較多的情況下更為明顯。
  2. 靜態資源的訪問形式。如果上面的Content,Scripts檔案夾下面還有子檔案夾(這是很常見的情形),只能通過resource的方式訪問,而不能通過偽物理地址的方式,不算太友好。

基於上面兩點,建議只將view視圖檔案作為內嵌資源編譯到dll中,所有的靜態檔案(js,css,image)可以放到主專案中,直接存取。或者放在Admin項目裡面,通過Build Event的方式同步到主專案相應目錄裡(參考上文)。

範例程式碼http://files.cnblogs.com/aehyok/MvcContrib.rar

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.