午夜国产狂喷潮在线观看|国产AⅤ精品一区二区久久|中文字幕AV中文字幕|国产看片高清在线

    ASP.NET MVC 5 - 給數(shù)據(jù)模型添加校驗(yàn)器
    來(lái)源:易賢網(wǎng) 閱讀:1265 次 日期:2014-08-28 13:33:22
    溫馨提示:易賢網(wǎng)小編為您整理了“ASP.NET MVC 5 - 給數(shù)據(jù)模型添加校驗(yàn)器”,方便廣大網(wǎng)友查閱!

    在本節(jié)中將會(huì)給Movie模型添加驗(yàn)證邏輯。并且確保這些驗(yàn)證規(guī)則在用戶創(chuàng)建或編輯電影時(shí)被執(zhí)行。

    拒絕重復(fù) DRY

    ASP.NET MVC 的核心設(shè)計(jì)信條之一是DRY: "不要重復(fù)自己(DRY --Don’t Repeat Yourself)"。ASP.NET MVC鼓勵(lì)您指定功能或者行為,只做一次,然后將它應(yīng)用到應(yīng)用程序的各個(gè)地方。這可以減少您需要編寫的代碼量,并減少代碼出錯(cuò)率,易于代碼維護(hù)。

    給ASP.NET MVC 和 Entity Framework Code First 提供驗(yàn)證支持是 DRY 信條的一次偉大實(shí)踐。您可以在一個(gè)地方 (模型類) 中以聲明的方式指定驗(yàn)證規(guī)則,這個(gè)規(guī)則會(huì)在應(yīng)用程序中的任何地方執(zhí)行。

    讓我們看看您如何在本電影應(yīng)用程序中,使用此驗(yàn)證支持。

    給電影模型添加驗(yàn)證規(guī)則

    您將首先向Movie類添加一些驗(yàn)證邏輯。

    打開(kāi)Movie.cs 文件,注意到System.Web 命名空間并未包含System.ComponentModel.DataAnnotations. DataAnnotations提供了一組內(nèi)置的嚴(yán)重屬性,可供您應(yīng)用于類、屬性。(DataAnnotations也包含一個(gè)DataType屬性,來(lái)幫助格式化的辦法來(lái)校驗(yàn))

    更新Movie類,以利用內(nèi)置的Required、 StringLength, RegularExpression和Range驗(yàn)證屬性。以下面的代碼為例,以應(yīng)用驗(yàn)證屬性。

    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屬性設(shè)置字符串的最大長(zhǎng)度,它會(huì)在數(shù)據(jù)庫(kù)上設(shè)置此限制,因此的數(shù)據(jù)庫(kù)schema將發(fā)生變化。右鍵單擊電影表, 在服務(wù)器資源管理器(Server explorer),然后單擊打開(kāi)表定義(Open Table Definition):

    clip_image002

    在上面的圖片中,你可以看到所有的字符串字段被設(shè)置為了NVARCHAR (MAX)數(shù)據(jù)類型. 我們將使用遷移來(lái)更新架構(gòu)。生成解決方案,然后打開(kāi)軟件包管理器控制臺(tái)(the Package Manager Console ),輸入如下命令:

    add-migration DataAnnotations

    update-database

    當(dāng)這個(gè)命令完成后,Visual Studio將打開(kāi)類代碼文件,它定義了新DbMIgration派生類(DataAnnotations),你可以在Up方法看到更新架構(gòu)約束代碼如下所示:

    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(也就是說(shuō),你必須輸入一個(gè)值)。該評(píng)級(jí)(Rating)字段最大長(zhǎng)度為5, 標(biāo)題的最大長(zhǎng)度為60。標(biāo)題(Title )和價(jià)格 (Price)的范圍的最小長(zhǎng)度并沒(méi)有更改。

    請(qǐng)?jiān)跀?shù)據(jù)庫(kù)中,檢查電影表的schema:

    clip_image004

    該字符串字段顯示新的長(zhǎng)度限制和流派字段(Genre)不能再為空。

    驗(yàn)證屬性指明您想要應(yīng)用到模型屬性的行為。Required 和MinimumLength屬性指出某一屬性不可為空,但沒(méi)有什么能夠阻止用戶輸入空格來(lái)驗(yàn)證。該RegularExpression屬性是用來(lái)限制哪些字符可以輸入。在上面的代碼中,流派(Genre)和等級(jí)(Rating)只能使用字母(空格,數(shù)字和特殊字符是不允許的)。該范圍(Range )屬性約束的值在一個(gè)指定范圍內(nèi)。在StringLength 屬性允許您設(shè)置一個(gè)字符串屬性的最大長(zhǎng)度,以及最小長(zhǎng)度(可選的)。值類型(decimal, int, float, DateTime)有固有必需設(shè)置的,不需要的Required屬性。

    Code First確保你的模型在指定class上在驗(yàn)證規(guī)則強(qiáng)制執(zhí)行之前應(yīng)用程序?qū)⒆兏鼉?chǔ)存在數(shù)據(jù)庫(kù)中。例如,下面的代碼將拋出一個(gè)DbEntityValidationException 異常時(shí),調(diào)用SaveChanges方法時(shí),因?yàn)閹讉€(gè)必要的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

    上面的代碼會(huì)拋出以下異常:

    Validation failed for one or more entities. 參閱 'EntityValidationErrors' 屬性獲得更多信息.

    具有通過(guò).NET Framework會(huì)自動(dòng)強(qiáng)制執(zhí)行的驗(yàn)證規(guī)則, 有助于使你的應(yīng)用程序更加健壯。它還確??梢圆粫?huì)忘記驗(yàn)證的東西,即在不經(jīng)意間不會(huì)讓壞的數(shù)據(jù)寫入數(shù)據(jù)庫(kù)。

    ASP.NET MVC 的驗(yàn)證錯(cuò)誤UI

    重新運(yùn)行應(yīng)用程序,瀏覽 /Movies的 URL。

    單擊Create New鏈接,來(lái)添加一部新電影。在窗體中填寫一些無(wú)效值,然后單擊Create按鈕。

    如同jQuery的客戶端驗(yàn)證來(lái)檢測(cè)到錯(cuò)誤時(shí),它會(huì)顯示一個(gè)錯(cuò)誤消息。

    注意,為了使jQuery支持使用逗號(hào)的非英語(yǔ)區(qū)域的驗(yàn)證 ,需要設(shè)置逗號(hào)(",")來(lái)表示小數(shù)點(diǎn),如本教程前面所述, 你須引入NuGet globalize。請(qǐng)注意,表單在每一個(gè)相應(yīng)的驗(yàn)證錯(cuò)誤消息旁邊,已經(jīng)自動(dòng)使用紅色邊框的顏色突出顯示文本框指明無(wú)效數(shù)據(jù)。這些錯(cuò)誤是強(qiáng)制執(zhí)行了客戶端端(使用JavaScript和jQuery)和服務(wù)器端(如果用戶禁用了JavaScript)。

    一個(gè)真正的好處是,你并不需要更改MoviesController類或Create.cshtml視圖中的一行代碼,來(lái)啟用此驗(yàn)證的用戶界面。您在前面教程所創(chuàng)建的控制器和視圖會(huì)自動(dòng)啟用,使用驗(yàn)證指明的Movie model類的屬性。使用Edit行為方法,同樣的驗(yàn)證方法也完全適用。直到?jīng)]有任何客戶端驗(yàn)證錯(cuò)誤的表單數(shù)據(jù),才會(huì)被發(fā)送回服務(wù)器。您可以通過(guò)在HTTP POST方法,用一個(gè)斷點(diǎn)來(lái)驗(yàn)證這一點(diǎn); 或通過(guò)使用fiddler tool,或者IE瀏覽器F12 developer tools。

    如何驗(yàn)證創(chuàng)建視圖和創(chuàng)建方法

    您可能很想知道驗(yàn)證用戶界面在沒(méi)有更新控制器或視圖代碼的情況下是如何生成的。下面列出了MovieController類中的Create方法。它們是之前教程中自動(dòng)生成的,并沒(méi)有修改。

    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 方法用來(lái)顯示初始的創(chuàng)建form。第二個(gè) ([HttpPost]) 方法處理form的請(qǐng)求。第二種Create方法 (HttpPost 版本) 調(diào)用 ModelState.IsValid來(lái)檢查是否有任何的Movie驗(yàn)證錯(cuò)誤。調(diào)用此方法將驗(yàn)證對(duì)象上所有應(yīng)用了驗(yàn)證約束的屬性。如果對(duì)象含有驗(yàn)證錯(cuò)誤,則Create方法會(huì)重新顯示初始的form。如果沒(méi)有任何錯(cuò)誤,方法將保存信息到數(shù)據(jù)庫(kù)。在我們的電影示例中,我們使用了驗(yàn)證,當(dāng)客戶端檢測(cè)到錯(cuò)誤時(shí),form不會(huì)被post到服務(wù)器;所以第二個(gè)Create方法永遠(yuǎn)不會(huì)被調(diào)用。如果您在瀏覽器中禁用了 JavaScript,客戶端驗(yàn)證也會(huì)被禁用,HTTP POST Create方法會(huì)調(diào)用 ModelState.IsValid來(lái)檢查影片是否含有任何驗(yàn)證錯(cuò)誤。

    您可以在HttpPost Create方法中設(shè)置一個(gè)斷點(diǎn),當(dāng)客戶端驗(yàn)證檢測(cè)到錯(cuò)誤時(shí),不會(huì)post form數(shù)據(jù),所以永遠(yuǎn)不會(huì)調(diào)用該方法。如果您在瀏覽器中禁用 JavaScript,然后提交具有錯(cuò)誤信息的form,斷點(diǎn)將會(huì)命中。您仍然得到充分的驗(yàn)證,即使在沒(méi)有 JavaScript的情況下。

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

    clip_image008

    clip_image010

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

    clip_image012

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

    clip_image014

    下面是框架代碼在之前的教程中生成的Create.cshtml視圖模板。它用來(lái)為以上兩個(gè)操作方法來(lái)顯示初始的form,同時(shí)在驗(yàn)證出錯(cuò)時(shí)來(lái)重新顯示視圖。

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

    }

    請(qǐng)注意,代碼如何使用Html.EditorFor helper 輸出為Movie中的每個(gè)屬性的<input>元素。此Helper旁邊是對(duì)Html.ValidationMessageFor方法的調(diào)用。這兩個(gè)Helper方法將處理由控制器傳遞到視圖的模型對(duì)象(在這里是,Movie對(duì)象)。它們會(huì)自動(dòng)查找模型中指定的驗(yàn)證屬性,并顯示適當(dāng)?shù)腻e(cuò)誤消息。

    如果您想要在后面更改驗(yàn)證邏輯,您可以做在一個(gè)地方,將驗(yàn)證信息添加到模型上。 (此示例中,是movie 類)。您不必?fù)?dān)心不符合規(guī)則 ,驗(yàn)證邏輯會(huì)在應(yīng)用程序的不同部分執(zhí)行——在一個(gè)地方定義驗(yàn)證邏輯將會(huì)被使用到各個(gè)地方。這使代碼非常干凈,并使它易于維護(hù)和擴(kuò)展。它意味著您會(huì)完全遵守DRY原則。

    使用DataType屬性

    打開(kāi)Movie.cs文件并檢查Movie類。在System.ComponentModel.DataAnnotations命名空間提供的格式化(formatting)屬性,除了內(nèi)置的一套驗(yàn)證的屬性。我們已經(jīng)應(yīng)用了的DataType枚舉值的ReleaseDate和Price 字段。下面的代碼顯示了ReleaseDate和Price 用適當(dāng)?shù)牡腄ataType屬性。

    [DataType(DataType.Date)]

    public DateTime ReleaseDate { get; set; }

    [DataType(DataType.Currency)]

    public decimal Price { get; set; }

    該DataType屬性只提供提示的視圖引擎對(duì)數(shù)據(jù)進(jìn)行格式化(與相應(yīng)的屬性,如<a>取代的URL及 <a href="mailto:EmailAddress.com">取代電子郵件。您可以使用RegularExpression的屬性來(lái)驗(yàn)證數(shù)據(jù)格式。DataType屬性用于指定一個(gè)比數(shù)據(jù)庫(kù)內(nèi)部類型更加具體的一種數(shù)據(jù)類型,但它們不是驗(yàn)證屬性。在這種情況下,我們只需要保留的日期跟蹤,而不是日期和時(shí)間。該枚舉的DataType提供了多種數(shù)據(jù)類型,如Date, Time, PhoneNumber, Currency, EmailAddress 和其他更多的。該的DataType 的屬性也可以使應(yīng)用程序來(lái)自動(dòng)提供特定類型的功能。例如,一個(gè)mailto:鏈接可以DataType.EmailAddress創(chuàng)建和日期選擇器可以在支持HTML5的瀏覽器提供的DataType.Date。該數(shù)據(jù)類型屬性發(fā)出的HTML5data-(發(fā)音讀數(shù)據(jù)破折號(hào))屬性與HTML5的瀏覽器可以理解。 該DataType 屬性不提供任何驗(yàn)證。

    DataType.Date并未指定顯示的日期格式。默認(rèn)情況下,根據(jù)基于服務(wù)器的的CultureInfo預(yù)設(shè)格式顯示數(shù)據(jù)字段。

    該DisplayFormat的屬性是用來(lái)顯式地指定日期格式的:

    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]

    public DateTime EnrollmentDate { get; set; }

    該ApplyFormatInEditMode設(shè)置指定了當(dāng)值進(jìn)行編輯顯示在一個(gè)文本框中,格式化亦應(yīng)適用。 (您可能不希望這樣的某些字段 - 例如貨幣值,你可能不希望在編輯文本框中出現(xiàn)貨幣符號(hào)。)

    你可以單獨(dú)使用DisplayFormat屬性;但和DataType屬性一起,通常是一個(gè)好主意。該DataType 屬性傳遞數(shù)據(jù)的語(yǔ)義,而不是如何呈現(xiàn)它在屏幕上,并具有以下的優(yōu)點(diǎn),不帶DisplayFormat的:

    · 瀏覽器可以使HTML5的功能(例如顯示一個(gè)日歷控件,在區(qū)域設(shè)置相應(yīng)的貨幣符號(hào),電子郵件中的鏈接,等等)。

    · 默認(rèn)情況下,瀏覽器就會(huì)使用基于語(yǔ)言環(huán)境(locale)的正確格式呈現(xiàn)數(shù)據(jù)。

    · 在的DataType屬性可以使MVC選擇合適的字段模板以呈現(xiàn)數(shù)據(jù)(如果本身所使用的的DisplayFormat使用字符串模板)。欲了解更多信息,請(qǐng)參閱see Brad Wilson's的ASP.NET MVC 2 Templates。 (雖然寫的MVC2,本文仍然適用于ASP.NET MVC 5的當(dāng)前版本。)

    如果你使用了的DataType的屬性具有一個(gè)日期字段,你也必須指明,以確保字段正確地呈現(xiàn)Chrome瀏覽器中的DisplayFormat屬性。欲了解更多信息,請(qǐng)參閱this StackOverflow thread。

    注:jQuery的驗(yàn)證不與Range屬性和DateTime的同時(shí)工作。例如,下面的代碼總是顯示一個(gè)客戶端驗(yàn)證錯(cuò)誤,即使當(dāng)日期是在指定的范圍內(nèi):

    [Range(typeof(DateTime), "1/1/1966", "1/1/2020")]

    你可能會(huì)禁用jQuery的日期校驗(yàn),而使用帶有的Range屬性DateTime。這通常不是一個(gè)好的做法,在你的模型里,編譯器很難確定日期,所以使用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; }

    }

    在教程的下一部分,我們先會(huì)看看代碼,然后再改進(jìn)一下自動(dòng)生成的Details 和 Delete 方法。

    更多信息請(qǐng)查看IT技術(shù)專欄

    更多信息請(qǐng)查看網(wǎng)絡(luò)編程
    易賢網(wǎng)手機(jī)網(wǎng)站地址:ASP.NET MVC 5 - 給數(shù)據(jù)模型添加校驗(yàn)器
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

    2025國(guó)考·省考課程試聽(tīng)報(bào)名

    • 報(bào)班類型
    • 姓名
    • 手機(jī)號(hào)
    • 驗(yàn)證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
    工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
    云南網(wǎng)警備案專用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報(bào)警專用圖標(biāo)