您現在的位置是:電腦技術吧?>? 故障問題 ??>??什么是數據模型,數據模型反映的是??>??正文詳情

什么是數據模型,數據模型反映的是

呼延貞婉2019-12-19 08:43:32 人圍觀
簡介數據庫三種數據模型在本節中,您將向電影模型添加驗證邏輯。并確保在用戶創建或編輯電影時強制執行這些驗證規則。拒絕重復dryasp.net MVC的核心設計原則之一是:不要重復自己。什么

在本節中將會給Movie模型添加驗證邏輯。

并且確保這些驗證規則在用戶創建或編輯電影時被執行。

拒絕重復 DRYASP.NET MVC 的核心設計信條之一是DRY: 不要重復自己(DRY --Dont Repeat Yourself)。

ASP.NET MVC鼓勵您指定功能或者行為,只做一次,然后將它應用到應用程序的各個地方。

這可以減少您需要編寫的代碼量,并減少代碼出錯率,易于代碼維護。

給ASP.NET MVC 和 Entity Framework Code First 提供驗證支持是 DRY 信條的一次偉大實踐。

您可以在一個地方 (模型類) 中以聲明的方式指定驗證規則,這個規則會在應用程序中的任何地方執行。

讓我們看看您如何在本電影應用程序中,使用此驗證支持。

給電影模型添加驗證規則您將首先向Movie類添加一些驗證邏輯。

打開Movie.cs 文件,注意到System.Web 命名空間并未包含System.ComponentModel.DataAnnotations. DataAnnotations提供了一組內置的嚴重屬性,可供您應用于類、屬性。

(DataAnnotations也包含一個DataType屬性,來幫助格式化的辦法來校驗)更新Movie類,以利用內置的Required、 StringLength, RegularExpression和Range驗證屬性。

以下面的代碼為例,以應用驗證屬性。

復制代碼public class Movie{public int ID { get; set; }[StringLength(60, MinimumLength = 3)]public string Title { get; set; }[Display(Name = Release Date)][DataType(DataType.Date)][DisplayFormat(DataFormatString = {0:yyyy-MM-dd}, ApplyFormatInEditMode = true)]public DateTime ReleaseDate { get; set; }[RegularExpression(@^[A-Z] [a-zA-Z''-'s]*$)][Required][StringLength(30)]public string Genre { get; set; }[Range(1, 100)][DataType(DataType.Currency)]public decimal Price { get; set; }[RegularExpression(@^[A-Z] [a-zA-Z''-'s]*$)][StringLength(5)]public string Rating { get; set; }}復制代碼在StringLength屬性設置字符串的最大長度,它會在數據庫上設置此限制,因此的數據庫schema將發生變化。

右鍵單擊電影表, 在服務器資源管理器(Server explorer),然后單擊打開表定義(Open Table Definition):clip_image002在上面的圖片中,你可以看到所有的字符串字段被設置為了NVARCHAR (MAX)數據類型. 我們將使用遷移來更新架構。

生成解決方案,然后打開軟件包管理器控制臺(the Package Manager Console ),輸入如下命令:add-migration DataAnnotationsupdate-database當這個命令完成后,Visual Studio將打開類代碼文件,它定義了新DbMIgration派生類(DataAnnotations),你可以在Up方法看到更新架構約束代碼如下所示:復制代碼public override void Up(){AlterColumn(dbo.Movies, Title, c = c.String(maxLength: 60));AlterColumn(dbo.Movies, Genre, c = c.String(nullable: false, maxLength: 30));AlterColumn(dbo.Movies, Rating, c = c.String(maxLength: 5));}復制代碼該流派(Genre)字段不再可為Null(也就是說,你必須輸入一個值)。

該評級(Rating)字段最大長度為5, 標題的最大長度為60。

標題(Title )和價格 (Price)的范圍的最小長度并沒有更改。

請在數據庫中,檢查電影表的schema:clip_image004該字符串字段顯示新的長度限制和流派字段(Genre)不能再為空。

驗證屬性指明您想要應用到模型屬性的行為。

Required 和MinimumLength屬性指出某一屬性不可為空,但沒有什么能夠阻止用戶輸入空格來驗證。

該RegularExpression屬性是用來限制哪些字符可以輸入。

在上面的代碼中,流派(Genre)和等級(Rating)只能使用字母(空格,數字和特殊字符是不允許的)。

該范圍(Range )屬性約束的值在一個指定范圍內。

在StringLength 屬性允許您設置一個字符串屬性的最大長度,以及最小長度(可選的)。

值類型(decimal, int, float, DateTime)有固有必需設置的,不需要的Required屬性。

Code First確保你的模型在指定class上在驗證規則強制執行之前應用程序將變更儲存在數據庫中。

例如,下面的代碼將拋出一個DbEntityValidationException 異常時,調用SaveChanges方法時,因為幾個必要的Movie屬性缺少:復制代碼MovieDBContext db = new MovieDBContext();Movie movie = new Movie();movie.Title = Gone with the Wind;db.Movies.Add(movie);db.SaveChanges(); // = Will throw server side validation exception復制代碼上面的代碼會拋出以下異常:Validation failed for one or more entities. 參閱 'EntityValidationErrors' 屬性獲得更多信息.具有通過.NET Framework會自動強制執行的驗證規則, 有助于使你的應用程序更加健壯。

它還確保可以不會忘記驗證的東西,即在不經意間不會讓壞的數據寫入數據庫。

ASP.NET MVC 的驗證錯誤UI重新運行應用程序,瀏覽 /Movies的 URL。

單擊Create New鏈接,來添加一部新電影。

在窗體中填寫一些無效值,然后單擊Create按鈕。

如同jQuery的客戶端驗證來檢測到錯誤時,它會顯示一個錯誤消息。

注意,為了使jQuery支持使用逗號的非英語區域的驗證 ,需要設置逗號(,)來表示小數點,如本教程前面所述, 你須引入NuGet globalize。

請注意,表單在每一個相應的驗證錯誤消息旁邊,已經自動使用紅色邊框的顏色突出顯示文本框指明無效數據。

這些錯誤是強制執行了客戶端端(使用JavaScript和jQuery)和服務器端(如果用戶禁用了JavaScript)。

一個真正的好處是,你并不需要更改MoviesController類或Create.cshtml視圖中的一行代碼,來啟用此驗證的用戶界面。

您在前面教程所創建的控制器和視圖會自動啟用,使用驗證指明的Movie model類的屬性。

使用Edit行為方法,同樣的驗證方法也完全適用。

直到沒有任何客戶端驗證錯誤的表單數據,才會被發送回服務器。

您可以通過在HTTP POST方法,用一個斷點來驗證這一點; 或通過使用fiddler tool,或者IE瀏覽器F12 developer tools。

如何驗證創建視圖和創建方法您可能很想知道驗證用戶界面在沒有更新控制器或視圖代碼的情況下是如何生成的。

下面列出了MovieController類中的Create方法。

它們是之前教程中自動生成的,并沒有修改。

復制代碼public ActionResult Create(){return View();}// POST: /Movies/Create// To protect from overposting attacks, please enable the specific properties you want to bind to, for// more details see http://go.microsoft.com/fwlink/?LinkId=317598.[HttpPost][ValidateAntiForgeryToken]public ActionResult Create([Bind(Include = ID,Title,ReleaseDate,Genre,Price,Rating)] Movie movie){if (ModelState.IsValid){ db.Movies.Add(movie); db.SaveChanges();return RedirectToAction(Index);}return View(movie);}復制代碼第一種(HTTP GET)Create 方法用來顯示初始的創建form。

第二個 ([HttpPost]) 方法處理form的請求。

第二種Create方法 (HttpPost 版本) 調用 ModelState.IsValid來檢查是否有任何的Movie驗證錯誤。

調用此方法將驗證對象上所有應用了驗證約束的屬性。

如果對象含有驗證錯誤,則Create方法會重新顯示初始的form。

如果沒有任何錯誤,方法將保存信息到數據庫。

在我們的電影示例中,我們使用了驗證,當客戶端檢測到錯誤時,form不會被post到服務器;所以第二個Create方法永遠不會被調用。

如果您在瀏覽器中禁用了 JavaScript,客戶端驗證也會被禁用,HTTP POST Create方法會調用 ModelState.IsValid來檢查影片是否含有任何驗證錯誤。

您可以在HttpPost Create方法中設置一個斷點,當客戶端驗證檢測到錯誤時,不會post form數據,所以永遠不會調用該方法。

如果您在瀏覽器中禁用 JavaScript,然后提交具有錯誤信息的form,斷點將會命中。

您仍然得到充分的驗證,即使在沒有 JavaScript的情況下。

下圖顯示了如何禁用 Internet Explorer 中的 JavaScript。

clip_image008clip_image010下圖顯示了如何在火狐瀏覽器中禁用 JavaScript。

clip_image012下圖顯示了如何在 Chrome 瀏覽器中禁用 JavaScript。

clip_image014下面是框架代碼在之前的教程中生成的Create.cshtml視圖模板。

它用來為以上兩個操作方法來顯示初始的form,同時在驗證出錯時來重新顯示視圖。

復制代碼@model [email protected]{ ViewBag.Title = Create;}h2Create/[email protected] (Html.BeginForm()){ @Html.AntiForgeryToken() div class=form-horizontalh4Movie/h4hr / @Html.ValidationSummary(true)div class=form-group @Html.LabelFor(model = model.Title, new { @class = control-label col-md-2 })div class=col-md-10 @Html.EditorFor(model = model.Title) @Html.ValidationMessageFor(model = model.Title)/div/div @*Fields removed for brevity.*@ div class=form-groupdiv class=col-md-offset-2 col-md-10input type=submit value=Create class=btn btn-default //div/div/div}div @Html.ActionLink(Back to List, Index)/[email protected] Scripts { @Scripts.Render(~/bundles/jqueryval)}復制代碼請注意,代碼如何使用Html.EditorFor helper 輸出為Movie中的每個屬性的input元素。

此Helper旁邊是對Html.ValidationMessageFor方法的調用。

這兩個Helper方法將處理由控制器傳遞到視圖的模型對象(在這里是,Movie對象)。

它們會自動查找模型中指定的驗證屬性,并顯示適當的錯誤消息。

如果您想要在后面更改驗證邏輯,您可以做在一個地方,將驗證信息添加到模型上。

(此示例中,是movie 類)。

您不必擔心不符合規則 ,驗證邏輯會在應用程序的不同部分執行在一個地方定義驗證邏輯將會被使用到各個地方。

這使代碼非常干凈,并使它易于維護和擴展。

它意味著您會完全遵守DRY原則。

使用DataType屬性打開Movie.cs文件并檢查Movie類。

在System.ComponentModel.DataAnnotations命名空間提供的格式化(formatting)屬性,除了內置的一套驗證的屬性。

我們已經應用了的DataType枚舉值的ReleaseDate和Price 字段。

下面的代碼顯示了ReleaseDate和Price 用適當的的DataType屬性。

[DataType(DataType.Date)]public DateTime ReleaseDate { get; set; }[DataType(DataType.Currency)]public decimal Price { get; set; }該DataType屬性只提供提示的視圖引擎對數據進行格式化(與相應的屬性,如a取代的URL及 a href=mailto:EmailAddress.com取代電子郵件。

您可以使用RegularExpression的屬性來驗證數據格式。

DataType屬性用于指定一個比數據庫內部類型更加具體的一種數據類型,但它們不是驗證屬性。

在這種情況下,我們只需要保留的日期跟蹤,而不是日期和時間。

該枚舉的DataType提供了多種數據類型,如Date, Time, PhoneNumber, Currency, EmailAddress 和其他更多的。

該的DataType 的屬性也可以使應用程序來自動提供特定類型的功能。

例如,一個mailto:鏈接可以DataType.EmailAddress創建和日期選擇器可以在支持HTML5的瀏覽器提供的DataType.Date。

該數據類型屬性發出的HTML5data-(發音讀數據破折號)屬性與HTML5的瀏覽器可以理解。

該DataType 屬性不提供任何驗證。

DataType.Date并未指定顯示的日期格式。

默認情況下,根據基于服務器的的CultureInfo預設格式顯示數據字段。

該DisplayFormat的屬性是用來顯式地指定日期格式的:[DisplayFormat(DataFormatString = {0:yyyy-MM-dd}, ApplyFormatInEditMode = true)]public DateTime EnrollmentDate { get; set; }該ApplyFormatInEditMode設置指定了當值進行編輯顯示在一個文本框中,格式化亦應適用。

(您可能不希望這樣的某些字段 - 例如貨幣值,你可能不希望在編輯文本框中出現貨幣符號。

)你可以單獨使用DisplayFormat屬性;但和DataType屬性一起,通常是一個好主意。

該DataType 屬性傳遞數據的語義,而不是如何呈現它在屏幕上,并具有以下的優點,不帶DisplayFormat的: 瀏覽器可以使HTML5的功能(例如顯示一個日歷控件,在區域設置相應的貨幣符號,電子郵件中的鏈接,等等)。

默認情況下,瀏覽器就會使用基于語言環境(locale)的正確格式呈現數據。

在的DataType屬性可以使MVC選擇合適的字段模板以呈現數據(如果本身所使用的的DisplayFormat使用字符串模板)。

欲了解更多信息,請參閱see Brad Wilson's的ASP.NET MVC 2 Templates。

(雖然寫的MVC2,本文仍然適用于ASP.NET MVC 5的當前版本。

)如果你使用了的DataType的屬性具有一個日期字段,你也必須指明,以確保字段正確地呈現Chrome瀏覽器中的DisplayFormat屬性。

欲了解更多信息,請參閱this StackOverflow thread。

注:jQuery的驗證不與Range屬性和DateTime的同時工作。

例如,下面的代碼總是顯示一個客戶端驗證錯誤,即使當日期是在指定的范圍內:[Range(typeof(DateTime), 1/1/1966, 1/1/2020)]你可能會禁用jQuery的日期校驗,而使用帶有的Range屬性DateTime。

這通常不是一個好的做法,在你的模型里,編譯器很難確定日期,所以使用Range屬性和DateTime效果不好。

下面的代碼顯示在同一行合并屬性:復制代碼public class Movie{public int ID { get; set; }[Required,StringLength(60, MinimumLength = 3)]public string Title { get; set; }[Display(Name = Release Date),DataType(DataType.Date)]public DateTime ReleaseDate { get; set; }[Required]public string Genre { get; set; }[Range(1, 100),DataType(DataType.Currency)]public decimal Price { get; set; }[Required,StringLength(5)]public string Rating { get; set; }}復制代碼在教程的下一部分,我們先會看看代碼,然后再改進一下自動生成的Details 和 Delete 方法。

版權聲明:本文由 呼延貞婉 整理編輯。

原標題:數據庫數據模型,如何建立數據模型

轉載注明出處:http://www.dn9ww09s.icu/fault/15544.html

文章評論

    共有條評論來說兩句吧...

    用戶名:

    驗證碼:

作者推薦

  • 兩種方式三個一些,議論方式兩種方式

    兩種方式三個一些,議論方式兩種方式 相關圖片表用兩種方式是怎么表示%dimdd,connstr dd=data.mdbconnstr=provider=microsoft.jet.oledb.4.0;datasource=se分包分為什么兩種方式...

  • detain和retain,retain和sustain

    detain和retain,retain和sustain 相關圖片certain原子和非原子用于確定編譯器生成的getter和setter是否是原子操作。當atomic設置成員變量的@property屬性時,它默認為atomic,提供多線程retain用法...

  • 檢索項目是什么意思,多媒體檢索 項目

    檢索項目是什么意思,多媒體檢索 項目 相關圖片大規模檢索為了提高在微軟Access項目中使用表單或數據表中的數據時的性能,可以設置從SQLServer數據庫下載的最大記錄數。一。在導航模式下打開數據表或窗體。2。請執檢索啥意思...

  • 和包怎么用,android獲取包名

    和包怎么用,android獲取包名 相關圖片和包券怎么激活Oracle獲取包所依賴的所有對象,包括其子對象。它使用一個臨時表來記錄被遍歷的節點,并使用層數來記錄被遍歷的包。總的來說,它可以改變很多。Declare—獲取和包券...

  • 打開Windows命令行,windows10命令行

    打開Windows命令行,windows10命令行 相關圖片windows常用命令行命令要從命令行啟動mysqld服務器,應啟動控制臺窗口(或DOS窗口),并輸入命令:C:C:program filesmysqlmysqlsqlsqlserver5windows命令行工具...

  • 查找數組元素的位置,數組查找某個元素

    查找數組元素的位置,數組查找某個元素 相關圖片在順序表中查找元素本文主要介紹了在JavaScript中添加、查找和刪除元素的方法,該方法簡單實用。如果需要的話你可以參考一下。代碼很簡單,這里沒有太多的廢話。?12345678selenium定位...

  • 安卓彈出消息框,如何設置手機qq不彈出

    安卓彈出消息框,如何設置手機qq不彈出 相關圖片怎么讓qq不彈出消息框我想這個問題經常被問到。實際上,這不是一個難題。我自己整理了索引,方便新手參考。在ASP彈出消息對話框中,確認對話框引用。彈出消息框的最簡單方法是在...

  • 什么是開源項目,如何加入開源項目

    什么是開源項目,如何加入開源項目 相關圖片go 開源項目一。在許多IOS開源項目中,afnetworking是最受開發人員歡迎的庫項目。Afnetworking是一個輕量級的IOS和Mac OSX網絡通信類庫。現在它php開源項目...

  • eth0基本配置,電腦基本配置有哪些

    eth0基本配置,電腦基本配置有哪些 相關圖片主機基本配置一。為結構應用程序配置web.xml文件步驟1:配置ActionServletServletServletnameAction/ServletnameServl汽車基本配置...

  • 蓋格計數器,蓋革計數器原理

    蓋格計數器,蓋革計數器原理 相關圖片手持計數器下面介紹如何用數據庫實現簡單計數器。另存為計數。ASP<%set conn=服務器。創建對象(ADODB。連接)conn.open driver={Micros程序計數器...

熱評文章

  • js獲取php的變量,php獲取變量類型

    js獲取php的變量,php獲取變量類型 相關圖片php設置變量本文通過一個實例說明PHP如何獲取系統變量。與您分享以供參考。具體如下:這里我們通過一些PHP內置函數獲取各種系統變量。?123456789$v=get_def獲取網站內容到php變量...

  • notification哪個好用,notification13

    notification哪個好用,notification13 相關圖片prenotification委托、通知和KVO的功能是相似的。在實際編程中如何選擇這些方法?在開發IOS應用程序時,我們經常遇到一個常見的問題:如何在控制器之間進行通信而不發生過度耦合。I...

  • 怎么讓復選框選中,設置復選框為選中狀態

    怎么讓復選框選中,設置復選框為選中狀態 相關圖片復選框選中事件本文的示例描述了jQuery切換所有復選框的方法。與您分享以供參考。具體如下:該代碼非常簡單實用。切換是否通過鏈接選中所有復選框?123456var tog=f復選框默認被選中...

  • 文檔分頁怎么設置,word顯示分頁效果

    文檔分頁怎么設置,word顯示分頁效果 相關圖片如何取消分頁預覽我認為最近幾天學習jsp非常好。我寫了一個尋呼類與您共享。同時,我想征求專家的意見。第1部分:db.mysqlconn數據庫鏈接類/**************電子表格分頁設置...

  • git使用教程圖文詳解,github使用教程圖文詳解

    git使用教程圖文詳解,github使用教程圖文詳解 相關圖片tortoisesvn使用教程Android Studio 1.0的官方版本終于發布了!谷歌表示,Android Studio 1.0可以讓開發人員更快、更高效,它可以取代eclipse,并git管理工具使用教程...

  • 導入導出是什么意思,導入導出聯系人怎么用

    導入導出是什么意思,導入導出聯系人怎么用 相關圖片mysql數據導入導出Linux系統引導Oracle自引導以根用戶身份登錄:Su-root 1,Linux下Oracle的dbstart和dbshut不響應:modify Oracljava導入導出...

  • solr搜索引擎,搜索引擎和solr

    solr搜索引擎,搜索引擎和solr 相關圖片搭建搜索引擎Solr是一個獨立的企業搜索應用服務器,它提供了一個類似于web服務的API接口。用戶可以通過HTTP請求向搜索引擎服務器提交一定格式的XML文件,生成索引。大搜索引擎el...

  • SQL中MINUS的用法,sql中iif函數的用法

    SQL中MINUS的用法,sql中iif函數的用法 相關圖片grant在數據庫中用法對于XML路徑:有些人可能知道有些人可能不知道,但實際上,它是以XML形式顯示查詢結果集。有了它,我們可以簡化查詢語句,以實現一些可能需要在之前的功能性實...

  • 常見編程術語,編程專業術語

    常見編程術語,編程專業術語 相關圖片計算機編程中常用的術語php什么意思?很多行外人看這三個會毫無頭緒完全不知道php是什么,本文小編就為大家詳細介紹一下php的含義,帶來編程術語php百科解釋。  php什么意思?編什么...

  • ip數據庫有什么用,連接數據庫IP

    ip數據庫有什么用,連接數據庫IP 相關圖片mysql數據庫ip地址本文主要介紹Python訪問純IP數據庫腳本共享,本文直接給出了實現代碼,可以參考以下項目的需要,通過IP地址來確定客戶端是Netcom還是電信。我從我的同事那sql數據庫...

關注微信

变脸官网查询