《ASP.NET MVC3高级编程》学习笔记2
生活随笔
收集整理的這篇文章主要介紹了
《ASP.NET MVC3高级编程》学习笔记2
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我的目標是月底前看完。今天偷懶了,只看了一點。
第4章:模型
Asp.Net MVC中的模型指是那些發送信息到數據庫,執行業務計算并在視圖中渲染的模型對象。 這些對象代表應用程序關注的領域,模型就是程序里想要保持、創建、更新和刪除的對象。 基架: 使用工具為每個模型對象的索引、創建、編輯和刪除等功能構建控制器和視圖的過程稱為基架(scaffolding)。基架不是必須的,但是可以省下很多時間。(其實就是代碼生成器了) 在創建Controller的對話框中可以選擇基架。 Asp.Net MVC中的默認基架可以為應用程序的CRUD生成所需的樣板代碼。 如果不喜歡默認的代碼生成機制,也可以自定義或者使用NuGet搜索scaffolding來查找可替代的模版。 實體框架: 可以從這里學習EF http://msdn.microsoft.com/en-us/data/aa937723 http://www.cnblogs.com/haogj/archive/2011/05/06/2038965.html Asp.Net 3 Tool Update之后新建的項目會包含EF4.1,并有基于EF的基架,當然完全可以去掉。 EF是一個ORM框架,不但可以保存.Net對象到數據庫,而且可以利用Linq來檢索這些數據。 EF4.1支持代碼優先,指在不創建數據庫、不打開VS設計器的情況下栽Sql Server中存儲或檢索信息。可以直接編寫存.Net類,EF知道如何保存到正確位置。 代碼優先風格和Asp.Net MVC一樣,遵照了很多的約定來生成數據庫。如名為id的屬性會被映射為主鍵,Album會被保存在Albums表中。 適合從0開始編寫應用程序。 MVC結合EF的例子: 1、先創建幾個模型 public class Album {public virtual int AlbumId { get; set; }public virtual int GenreId { get; set; }public virtual int ArtistId { get; set; }public virtual string Title { get; set; }public virtual decimal Price { get; set; }public virtual string AlbumArtUrl { get; set; }public virtual Genre Genre { get; set; }public virtual Artist Artist { get; set; } } public class Artist {public virtual int ArtistId { set; get; }public virtual string Name { get; set; } } public class Genre {public virtual int GenreId { set; get; } public virtual string Name{ set; get; } } 創建的Model屬性時候使用virtual不是必須的,但是可以打開EF的一些特性,如高效的修改跟蹤機制(對EF沒研究,沒看懂,過后研究) 2、使用EF的代碼優先時需要從EF的DbContext類派生出一個類來訪問數據庫,在訪問數據庫時候只需要實例化這個類就行。 派生類具有多個DbSet<T>字段,每個T代表一個要保存的對象,如下(可以不寫,在添加Controller時候選擇新建,讓基架自己生成): public class MusicStoreDB : DbContext {public DbSet<Album> Albums { get; set; }public DbSet<Genre> Genres { get; set; }public DbSet<Artist> Artists { get; set; } } 3、使用自帶的基架模版生成代碼 4、生成的Controller的代碼片段: private MusicStoreDB db = new MusicStoreDB();public ViewResult Index() {var albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist);//預加載return View(albums.ToList()); }[HttpPost] public ActionResult Edit(Album album) {if (ModelState.IsValid)//驗證模型修改的有效性 {db.Entry(album).State = EntityState.Modified;db.SaveChanges();return RedirectToAction("Index");}ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "GenreId", album.GenreId);ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId);return View(album); }Include方法表示采用預加載策略,把關聯的數據盡可能的全加載進來。延遲加載的每一條記錄在訪問子對象時候會往數據庫多發出一個額外的查詢!
反之是延遲加載: var albums = db.Albums//延遲加載 ? 5、生成的編輯Action代碼中,子對象使用ViewBag傳值,對應的View子對象使用DropDownList提供選擇。 這里可以考慮創建ViewModel,使用強類型視圖(沒有好不好之說,看是否合適)。 ? 6、運行之前需要往web.config里加入一個連接字符串 <connectionStrings><add name="MusicStoreDB"connectionString="data source .................."providerName="System.Data.SqlClient" /> </connectionStrings>? 這樣運行起來,數據庫中就會自動生成一個對應Model關系的數據庫了。 Model和數據庫的同步: 如果修改Model,EF要嘛重新創建數據庫,要嘛就拋異常。 重建數據庫需要提供一個數據庫初始化器,如下: Database.SetInitializer(new DropCreateDatabaseAlways<MusicStoreDB>()); //框架提供兩個IDatabaseInitializer的實現類: //DropCreateDatabaseAlways和DropCreateDatabaseIfModelChanges,見名知意 可以重寫IDatabaseInitializer的Seed方法,為生成的數據庫添加基本數據。 ? ModelBinder: MVC框架可以為不同類型的模型注冊多個ModelBinder,默認實現是DefaultModelBinder。 DefaultModelBinder將檢查參數聲明的類型,從請求中將命名符合約定的值注入到一個相應的對象中。 例如,ModelBinder看到參數為Album,而Album有Title屬性時,就會在請求中找到名為Title的參數,填入。 ModelBinder使用IValueProvider,在請求的不同區域查找參數。可以查看路由數據、查詢字符串、表單數據等,也可自定義IValueProvider,后面章節有。 模型邦定可能存在安全性問題,比如修改到不能修改的屬性,叫做over-posting攻擊,預防方法后面章節有。 當Action中有參數時候,ModelBinder會隱式工作,也可以使用Controller中的UpdateModel和TryUpateModel方法顯示地調用模型 綁定?。這兩個方法關系到驗證的問題,使用起來和int.Parse與int.TryParse一樣。調用 TryUpateModel后直接查看ModelState.IsValid也能查看是否綁定成功。轉載于:https://www.cnblogs.com/rehope/archive/2012/07/15/2592579.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的《ASP.NET MVC3高级编程》学习笔记2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP 的时间格式
- 下一篇: DOM中的outerHTML,inner