99re热视频这里只精品,久久久天堂国产精品女人,国产av一区二区三区,久久久精品成人免费看片,99久久精品免费看国产一区二区三区

將驗證添加到 ASP.NET Core Razor 頁面

2019-04-17 08:57 更新

本部分中向 Movie 模型添加了驗證邏輯。 每當用戶創(chuàng)建或編輯電影時,都會強制執(zhí)行驗證規(guī)則。

驗證

軟件開發(fā)的一個關鍵原則被稱為 DRY(即“不要自我重復”)。 Razor 頁面鼓勵進行僅指定一次功能的開發(fā),且功能在整個應用中反映。 DRY 可以幫助:

  • 減少應用中的代碼量。
  • 使代碼更加不易出錯,且更易于測試和維護。

Razor 頁面和 Entity Framework 提供的驗證支持是 DRY 原則的極佳示例。 驗證規(guī)則在模型類中的某處以聲明方式指定,且在應用的所有位置強制執(zhí)行。

將驗證規(guī)則添加到電影模型

打開 Models/Movie.cs 文件。 DataAnnotations 提供一組內置驗證特性,可通過聲明方式應用于類或屬性。 DataAnnotations 還包含 DataType 等格式特性,有助于格式設置但不提供驗證。

更新 Movie 類以使用 Required、StringLength、RegularExpression 和 Range 驗證特性。

C#

public class Movie
{
    public int ID { get; set; }

    [StringLength(60, MinimumLength = 3)]
    [Required]
    public string Title { get; set; }

    [Display(Name = "Release Date")]
    [DataType(DataType.Date)]
    public DateTime ReleaseDate { get; set; }

    [Range(1, 100)]
    [DataType(DataType.Currency)]
    [Column(TypeName = "decimal(18, 2)")]
    public decimal Price { get; set; }

    [RegularExpression(@"^[A-Z]+[a-zA-Z""'\s-]*$")]
    [Required]
    [StringLength(30)]
    public string Genre { get; set; }

    [RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$")]
    [StringLength(5)]
    [Required]
    public string Rating { get; set; }
}

驗證特性用于指定模型屬性上強制執(zhí)行的行為:

  • Required 和 MinimumLength 特性指示屬性必須具有一個值。 但是,用戶可以隨時輸入空格以對可以為 null 的類型進行驗證約束。 從本質上來說,需要不可以為 null 的值類型(如 decimal、int、float 和 DateTime),但不需要 Required 特性。
  • RegularExpression 特性限制用戶可以輸入的字符。 在前面的代碼中,Genre 必須以一個或多個大寫字母開始,并且后接零個或多個字母、單引號或雙引號、空白字符或短劃線。 Rating 必須以一個或多個大寫字母開始,并且后接零個或多個字母、數(shù)字、單引號或雙引號、空白字符或短劃線。
  • Range 特性將值限制在指定范圍內。
  • StringLength 特性設置字符串的最大長度,且可視情況設置最小長度。

讓 ASP.NET Core 強制自動執(zhí)行驗證規(guī)則有助于提升應用的可靠性。 自動驗證模型有助于保護應用,因為添加新代碼時無需手動應用它們。

Razor 頁面中的“驗證錯誤”UI

運行應用并導航到“頁面/電影”。

選擇“新建”鏈接。 使用無效值填寫表單。 當 jQuery 客戶端驗證檢測到錯誤時,會顯示一條錯誤消息。

帶有多個 jQuery 客戶端驗證錯誤的電影視圖表單

 備注

可能無法在小數(shù)字段中輸入十進制逗號。 若要使 jQuery 驗證支持使用逗號(“,”)表示小數(shù)點的的非英語區(qū)域設置,以及支持非美國英語日期格式,必須執(zhí)行使應用全球化的步驟。 有關添加十進制逗號的說明,請參閱 GitHub 問題 4076。

請注意表單如何自動呈現(xiàn)每個包含無效值的字段中的驗證錯誤消息。 客戶端(使用 JavaScript 和 jQuery)和服務器端(若用戶禁用 JavaScript)都必定會遇到這些錯誤。

一項重要優(yōu)勢是,無需在“創(chuàng)建”或“編輯”頁面中更改代碼。 在模型應用 DataAnnotations 后,即已啟用驗證 UI。 本教程中自動創(chuàng)建的 Razor 頁面自動選取了驗證規(guī)則(使用 Movie 模型類的屬性上的驗證特性)。 使用“編輯”頁面測試驗證后,即已應用相同驗證。

存在客戶端驗證錯誤時,不會將表單數(shù)據(jù)發(fā)布到服務器。 請通過以下一種或多種方法驗證是否未發(fā)布表單數(shù)據(jù):

  • 在 OnPostAsync 方法中放置一個斷點。 提交表單(選擇“創(chuàng)建”或“保存”)。 從未命中斷點。
  • 使用 Fiddler 工具
  • 使用瀏覽器開發(fā)人員工具監(jiān)視網(wǎng)絡流量。

服務器端驗證

在瀏覽器中禁用 JavaScript 后,提交出錯表單將發(fā)布到服務器。

(可選)測試服務器端驗證:

  • 在瀏覽器中禁用 JavaScript。 可以使用瀏覽器的開發(fā)人員工具執(zhí)行此操作。 如果無法在瀏覽器中禁用 JavaScript,請嘗試其他瀏覽器。
  • 在“創(chuàng)建”或“編輯”頁面的 OnPostAsync 方法中設置斷點。
  • 提交帶有驗證錯誤的表單。
  • 驗證模型狀態(tài)是否無效:C#復制if (!ModelState.IsValid) { return Page(); }

以下代碼顯示了之前在本教程中設定其基架的“Create.cshtml”的一部分。 它用于在“創(chuàng)建”和“編輯”頁面中顯示初始表單并在發(fā)生錯誤后重新顯示表單。

CSHTML

<form method="post">
    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <div class="form-group">
        <label asp-for="Movie.Title" class="control-label"></label>
        <input asp-for="Movie.Title" class="form-control" />
        <span asp-validation-for="Movie.Title" class="text-danger"></span>
    </div>

輸入標記幫助程序使用 DataAnnotations 特性并在客戶端生成 jQuery 驗證所需的 HTML 特性。 驗證標記幫助程序用于顯示驗證錯誤。 有關詳細信息,請參閱驗證。

“創(chuàng)建”和“編輯”頁面中沒有驗證規(guī)則。 僅可在 Movie 類中指定驗證規(guī)則和錯誤字符串。 這些驗證規(guī)則將自動應用于編輯 Movie 模型的 Razor 頁面。

需要更改驗證邏輯時,也只能在該模型中更改。 將始終在整個應用程序中應用驗證(在一處定義驗證邏輯)。 單處驗證有助于保持代碼干凈,且更易于維護和更新。

使用 DataType 特性

檢查 Movie 類。 除了一組內置的驗證特性,System.ComponentModel.DataAnnotations 命名空間還提供格式特性。 DataType 特性應用于 ReleaseDate 和 Price 屬性。

C#

[Display(Name = "Release Date")]
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }

[Range(1, 100)]
[DataType(DataType.Currency)]
public decimal Price { get; set; }

DataType 特性僅提供相關提示來幫助視圖引擎設置數(shù)據(jù)格式(并提供特性,例如向 URL 提供 <a>和向電子郵件提供 <a href="mailto:EmailAddress.com">)。 使用 RegularExpression 特性驗證數(shù)據(jù)的格式。 DataType 屬性用于指定比數(shù)據(jù)庫內部類型更具體的數(shù)據(jù)類型。 DataType 特性不是驗證特性。 示例應用程序中僅顯示日期,不顯示時間。

DataType 枚舉提供了多種數(shù)據(jù)類型,例如日期、時間、電話號碼、貨幣、電子郵件地址等。 應用程序還可通過 DataType 特性自動提供類型特定的功能。 例如,可為 DataType.EmailAddress 創(chuàng)建 mailto: 鏈接。 可在支持 HTML5 的瀏覽器中為 DataType.Date 提供日期選擇器。 DataType 特性發(fā)出 HTML 5 data-(讀作 data dash)特性供 HTML 5 瀏覽器使用。 DataType 特性不提供任何驗證。

DataType.Date 不指定顯示日期的格式。 默認情況下,數(shù)據(jù)字段根據(jù)基于服務器的 CultureInfo 的默認格式進行顯示。

要使 Entity Framework Core 能將 Price 正確地映射到數(shù)據(jù)庫中的貨幣,則必須使用 [Column(TypeName = "decimal(18, 2)")] 數(shù)據(jù)注釋。 有關詳細信息,請參閱數(shù)據(jù)類型

DisplayFormat 特性用于顯式指定日期格式:

C#

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }

ApplyFormatInEditMode 設置用于指定在顯示值進行編輯時需應用格式。 可能不希望某些字段具有此行為。 例如,在貨幣值中,可能不希望編輯 UI 中存在貨幣符號。

可單獨使用 DisplayFormat 特性,但通常建議使用 DataType 特性。 DataType 特性傳達數(shù)據(jù)的語義而不是傳達如何在屏幕上呈現(xiàn)數(shù)據(jù),并提供 DisplayFormat 不具備的以下優(yōu)勢:

  • 瀏覽器可啟用 HTML5 功能(例如顯示日歷控件、區(qū)域設置適用的貨幣符號、電子郵件鏈接等)
  • 默認情況下,瀏覽器將根據(jù)區(qū)域設置采用正確的格式呈現(xiàn)數(shù)據(jù)。
  • 借助 DataType 特性,ASP.NET Core 框架可選擇適當?shù)淖侄文0鍋沓尸F(xiàn)數(shù)據(jù)。 單獨使用時,DisplayFormat 特性將使用字符串模板。

注意:jQuery 驗證不適用于 Range 屬性和 DateTime。 例如,以下代碼將始終顯示客戶端驗證錯誤,即便日期在指定的范圍內:

C#

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

通常,在模型中編譯固定日期是不恰當?shù)?,因此不推薦使用 Range 特性和 DateTime。

以下代碼顯示組合在一行上的特性:

C#

public class Movie
{
    public int ID { get; set; }

    [StringLength(60, MinimumLength = 3)]
    public string Title { get; set; }

    [Display(Name = "Release Date"), DataType(DataType.Date)]
    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)]
    [Column(TypeName = "decimal(18, 2)")]
    public decimal Price { get; set; }

    [RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$"), StringLength(5)]
    public string Rating { get; set; }
}

Razor Pages 和 EF Core 入門顯示了 Razor Pages 的高級 EF Core 操作。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號