中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

ASP.NET MVC 5 - 給數據模型添加校驗器
來源:易賢網 閱讀:1504 次 日期:2014-08-28 13:33:22
溫馨提示:易賢網小編為您整理了“ASP.NET MVC 5 - 給數據模型添加校驗器”,方便廣大網友查閱!

在本節中將會給Movie模型添加驗證邏輯。并且確保這些驗證規則在用戶創建或編輯電影時被執行。

拒絕重復 DRY

ASP.NET MVC 的核心設計信條之一是DRY: "不要重復自己(DRY --Don’t 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 DataAnnotations

update-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_image008

clip_image010

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

clip_image012

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

clip_image014

下面是框架代碼在之前的教程中生成的Create.cshtml視圖模板。它用來為以上兩個操作方法來顯示初始的form,同時在驗證出錯時來重新顯示視圖。

@model MvcMovie.Models.Movie

@{

ViewBag.Title = "Create";

}

<h2>Create</h2>

@using (Html.BeginForm())

{

@Html.AntiForgeryToken()

<div class="form-horizontal">

<h4>Movie</h4>

<hr />

@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-group">

<div class="col-md-offset-2 col-md-10">

<input type="submit" value="Create" class="btn btn-default" />

</div>

</div>

</div>

}

<div>

@Html.ActionLink("Back to List", "Index")

</div>

@section 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 方法。

更多信息請查看IT技術專欄

更多信息請查看網絡編程
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
久久九九久久九九| 久久午夜电影| 欧美大片在线影院| 在线一区二区三区做爰视频网站 | 蜜桃久久精品乱码一区二区| 久久爱www久久做| 亚洲欧美在线视频观看| 亚洲精品一区二| 怡红院av一区二区三区| 欧美三级欧美一级| 欧美高清一区二区| 欧美日韩亚洲系列| 国产精品一区二区在线| 国产一区二区激情| 韩国美女久久| 亚洲视频视频在线| 亚洲精品久久| 一本久久知道综合久久| 99精品99久久久久久宅男| 亚洲国产精品尤物yw在线观看| 亚洲国产成人久久综合一区| 国产欧美精品一区二区色综合 | 美国十次成人| 欧美日韩精品一区二区三区| 欧美成人一区二区三区| 欧美激情精品久久久久久| 久久久久88色偷偷免费| 欧美激情综合| …久久精品99久久香蕉国产| 亚洲一区二区三区乱码aⅴ| 亚洲精品日产精品乱码不卡| 99国产精品久久久久老师| 香蕉尹人综合在线观看| 欧美性视频网站| 夜夜精品视频| 国产精品久久国产愉拍| 亚洲视频在线观看免费| 欧美日韩在线第一页| 亚洲精品免费电影| 欧美极品影院| 一区二区免费在线视频| 欧美日韩一区二区精品| 亚洲一区日韩| 伊大人香蕉综合8在线视| 久久精品国产99精品国产亚洲性色| 男人插女人欧美| 亚洲第一狼人社区| 免费视频亚洲| 亚洲一区二区精品视频| 国产亚洲精品美女| 久久综合色一综合色88| 日韩午夜电影| 国产一区二区成人久久免费影院| 欧美一区永久视频免费观看| 国产主播一区二区三区| 欧美大片国产精品| 亚洲一区二区三区视频播放| 国产欧美一区二区精品秋霞影院| 久久视频国产精品免费视频在线| 国产一区欧美日韩| 欧美日韩一区二区三区四区在线观看| 性伦欧美刺激片在线观看| 国产精品欧美风情| 麻豆精品一区二区综合av| 亚洲精品国精品久久99热| 国产精品高清在线观看| 久久综合网络一区二区| 99精品99| 日韩视频中文| 国产精品国内视频| 嫩草伊人久久精品少妇av杨幂| 亚洲人体影院| 亚洲国产成人久久综合| 国产区日韩欧美| 欧美成人视屏| 久久这里只精品最新地址| 一区二区三区四区五区视频| 亚洲人线精品午夜| 国产精品久久久爽爽爽麻豆色哟哟| 美女图片一区二区| 欧美成人69av| 国产精品久久久久久久久久免费| 欧美高清在线播放| 欧美a级片一区| 欧美日韩国产首页| 欧美日韩在线不卡| 国产精品九九久久久久久久| 欧美私人网站| 欧美日韩精品免费观看视频| 蜜臀久久99精品久久久画质超高清| 欧美一二三区精品| 午夜一区在线| 欧美www视频在线观看| 欧美激情1区| 欧美成人四级电影| 久久亚洲午夜电影| 欧美日韩国产区| 国产欧美一区二区精品性 | 欧美一区2区三区4区公司二百| 亚洲自拍电影| 久久久夜精品| 国产精品久久一区主播| **网站欧美大片在线观看| 亚洲午夜精品久久久久久浪潮 | 久久精品人人做人人爽| 欧美日韩在线一区二区三区| 亚洲国产成人久久综合| 美女精品在线观看| 欧美色图五月天| 日韩视频欧美视频| 欧美18av| 在线看片成人| 欧美成人精品| 最新中文字幕一区二区三区| 美女视频黄a大片欧美| 亚洲黄色免费电影| 欧美精品一区在线| 亚洲一区免费网站| 黄色亚洲在线| 欧美激情1区2区| 在线一区视频| 国产目拍亚洲精品99久久精品| 午夜激情一区| 亚洲欧洲日韩在线| 国产精品青草久久| 久久亚洲精品欧美| 一区二区视频免费在线观看| 欧美电影电视剧在线观看| 亚洲一区二区精品| 最近中文字幕日韩精品| 国产精品爽爽爽| 久久成人免费网| 日韩一级片网址| 国产精品免费一区二区三区在线观看| 久久精品一区二区| 亚洲人精品午夜在线观看| 国产精品网曝门| 国产精品v欧美精品∨日韩| 久热re这里精品视频在线6| 亚洲视频播放| 日韩小视频在线观看| 亚洲区欧美区| 亚洲欧洲在线观看| 亚洲第一福利在线观看| 国产精品成人久久久久| 欧美在线一二三四区| 99亚洲精品| 一区二区国产日产| 亚洲电影在线免费观看| 国产午夜亚洲精品不卡| 欧美性感一类影片在线播放| 欧美片在线播放| 欧美日韩另类视频| 国产精品乱码久久久久久| 欧美人成免费网站| 欧美猛交免费看| 国产欧美一区二区精品性| 一区在线播放视频| 亚洲激情二区| 先锋影音久久| 欧美精品激情blacked18| 国产精品国产三级国产专播精品人| 欧美性开放视频| 尤物视频一区二区| 尤物精品国产第一福利三区| 亚洲国产成人91精品| 亚洲影院免费| 国产欧美亚洲一区| 亚洲国产日韩欧美在线动漫| 在线亚洲一区二区| 欧美一区视频| 另类欧美日韩国产在线| 国产欧美欧洲在线观看| 亚洲经典自拍| 久久国产婷婷国产香蕉| 国产精品成人播放| 亚洲美女av电影| 欧美日产国产成人免费图片| 韩国av一区二区三区在线观看| 9国产精品视频| 久久久中精品2020中文| 国产精品xvideos88| 一区二区三区精密机械公司| 久久久久久成人| 欧美日韩精品一区二区| 国产一区二区成人| 亚洲影院污污.| 国产亚洲欧美中文| 老司机一区二区三区| 亚洲国产精品欧美一二99| 快射av在线播放一区| 99国产精品国产精品久久| 欧美午夜视频网站| 久久亚洲综合| 日韩视频在线永久播放| 欧美日韩在线播放一区二区| 亚洲欧美日韩精品一区二区| 国产精品久久九九| 欧美一级欧美一级在线播放| 国产一区91|