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

ASP.NET MVC 5 - 給數據模型添加校驗器
來源:易賢網 閱讀:894 次 日期:2014-10-13 11:53:16
溫馨提示:易賢網小編為您整理了“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)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
久久婷婷成人综合色| 欧美日韩国产精品专区| 黄色影院成人| 久久国产免费看| 国产午夜精品久久久久久久| 欧美在线视频免费观看| 黄色小说综合网站| 麻豆精品一区二区综合av| 亚洲精品久久| 欧美视频中文字幕| 午夜日韩激情| 在线看一区二区| 欧美伦理视频网站| 亚洲欧美日本另类| 1000部国产精品成人观看| 欧美激情亚洲国产| 午夜精品福利电影| 在线观看日韩| 国产精品成人免费精品自在线观看| 亚洲欧美视频一区| 亚洲成色精品| 国产精品日韩二区| 模特精品裸拍一区| 亚洲欧美精品伊人久久| 亚洲国产另类精品专区| 国产精品扒开腿做爽爽爽软件| 欧美在线播放| 亚洲天堂成人| 亚洲国产精品嫩草影院| 国产日本欧美一区二区| 欧美日韩免费区域视频在线观看| 欧美一区午夜精品| 中日韩在线视频| 在线观看日韩欧美| 国产亚洲精久久久久久| 欧美视频在线看| 欧美a级片网| 久久国产日本精品| 亚洲欧美在线一区| 一区二区冒白浆视频| 亚洲丁香婷深爱综合| 国产亚洲综合精品| 国产精品免费看| 欧美日韩在线视频观看| 欧美成人视屏| 久久综合九色| 久久久久久久久蜜桃| 亚洲欧美日韩一区二区三区在线 | 欧美日韩视频在线一区二区观看视频| 欧美在线观看视频一区二区三区 | 欧美日韩在线直播| 久久蜜桃资源一区二区老牛| 日韩视频专区| 91久久中文| 日韩小视频在线观看专区| 激情久久综艺| 好男人免费精品视频| 国产乱码精品一区二区三| 国产精品国产三级国产a| 国产精品爱久久久久久久| 欧美女同在线视频| 欧美一区二区三区的| 午夜老司机精品| 亚洲欧美综合v| 久久国产主播精品| 久久久国产精彩视频美女艺术照福利| 久久xxxx| 欧美国产精品人人做人人爱| 欧美二区在线观看| 国产精品二区在线| 国产精品一二三| 国产亚洲激情| 亚洲黄色一区| 夜夜嗨av一区二区三区四区| 亚洲天堂偷拍| 午夜欧美精品久久久久久久| 国产伦精品一区二区三区视频孕妇| 国产欧美日韩综合一区在线观看 | 久久精品国产第一区二区三区| 久久精品麻豆| 欧美电影免费| 国产精品进线69影院| 国产日韩免费| 亚洲国产91精品在线观看| 一本色道久久综合精品竹菊| 亚洲欧美日韩久久精品| 久久久久高清| 欧美午夜精品久久久久久超碰| 国产精品日韩欧美一区二区三区| 国产最新精品精品你懂的| 亚洲国产婷婷| 亚洲欧美一区二区在线观看| 奶水喷射视频一区| 国产精品yjizz| 亚洲国产一区二区精品专区| 亚洲一区二区少妇| 另类图片国产| 国产视频久久| 夜夜嗨av一区二区三区中文字幕| 久久精品99| 欧美午夜三级| 在线日韩欧美| 欧美综合国产| 欧美天堂亚洲电影院在线观看| 免费黄网站欧美| 一本色道精品久久一区二区三区| 午夜国产不卡在线观看视频| 久久综合影视| 国产欧美日韩激情| 99精品久久| 欧美高清hd18日本| 国产视频一区三区| 亚洲性感激情| 欧美日本在线一区| 亚洲国产黄色| 久久精品一区中文字幕| 欧美深夜福利| 亚洲开发第一视频在线播放| 久久野战av| 国产亚洲精品v| 亚洲社区在线观看| 欧美高清视频在线播放| 国产综合欧美| 久久精品国产77777蜜臀| 欧美色图一区二区三区| 99国产精品视频免费观看一公开 | 欧美日韩国产三级| 1024国产精品| 久久婷婷蜜乳一本欲蜜臀| 国产日产亚洲精品| 欧美一级理论性理论a| 国产精品亚洲综合久久| 一区二区久久久久久| 欧美女同视频| 一本色道久久综合狠狠躁篇怎么玩| 免费观看不卡av| 91久久国产精品91久久性色| 久久久久久久波多野高潮日日 | 国产精品红桃| 亚洲影视在线播放| 国产精品乱子久久久久| 亚洲视屏在线播放| 国产精品一区二区黑丝| 亚洲影视在线| 国产在线观看精品一区二区三区| 久久久精品国产99久久精品芒果| 国产综合精品一区| 免费观看成人www动漫视频| 亚洲第一区色| 欧美日韩1区| 亚洲在线观看视频| 国产日韩欧美视频在线| 亚洲一区二区在线观看视频| 亚洲精品影院在线观看| 一个色综合av| 欧美日韩在线精品一区二区三区| 欧美精品日韩www.p站| 国产精品国产三级国产aⅴ入口 | 午夜精品成人在线| 亚洲国产一区二区三区青草影视| 亚洲日本中文字幕区| 亚洲一区免费视频| 伊人精品在线| 久久婷婷久久| 99精品视频免费在线观看| 国产精品男人爽免费视频1| 欧美一区免费| 亚洲人成网站色ww在线| 国产精品v日韩精品| 久久激情视频久久| 日韩亚洲欧美中文三级| 国产美女一区二区| 美国十次了思思久久精品导航| 9色精品在线| 国模大胆一区二区三区| 欧美乱妇高清无乱码| 欧美一区二区三区啪啪 | 男人插女人欧美| 亚洲精品欧美日韩专区| 国产视频亚洲精品| 欧美另类99xxxxx| 国产日韩欧美自拍| 欧美精品国产| 欧美一区亚洲| 亚洲小说区图片区| 136国产福利精品导航| 国产精品永久在线| 欧美日韩视频在线第一区| 久久免费的精品国产v∧| 午夜伦欧美伦电影理论片| 亚洲日本成人| 在线观看日韩精品| 国产啪精品视频| 欧美视频在线观看一区| 欧美1区2区视频| 久久久噜久噜久久综合| 午夜天堂精品久久久久 | 一区精品在线播放| 欧美视频一区二区三区…| 老司机aⅴ在线精品导航|