ASP.NET CORE RAZOR :向 Razor 页面添加验证
https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/validation
本部分中向?Movie?模型添加了驗證邏輯。?每當用戶創建或編輯電影時,都會強制執行驗證規則。
驗證
軟件開發的一個關鍵原則被稱為?DRY(即“不要自我重復”)。?Razor 頁面鼓勵進行僅指定一次功能的開發,且功能在整個應用中反映。?DRY 有助于減少應用中的代碼量。?DRY 使代碼更加不易出錯,且更易于測試和維護。
Razor 頁面和 Entity Framework 提供的驗證支持是 DRY 原則的極佳示例。?驗證規則在模型類中的某處以聲明方式指定,且在應用的所有位置強制執行。
將驗證規則添加到電影模型
打開 Movie.cs 文件。?DataAnnotations?提供一組內置驗證特性,可通過聲明方式應用于類或屬性。?DataAnnotations 還包含DataType?等格式特性,有助于格式設置但不提供驗證。
更新?Movie?類以使用?Required、StringLength、RegularExpression?和?Range?驗證特性。
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)]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-Z""'\s-]*$")][StringLength(5)][Required]public string Rating { get; set; } }驗證特性用于指定模型屬性上強制執行的行為:
- Required?和?MinimumLength?特性指示屬性必須具有一個值。?但是,用戶可以隨時輸入空格以對可以為 null 的類型進行驗證約束。?從本質上來說,需要不可以為 null 的值類型(如?decimal、int、float?和?DateTime),但不需要?Required?特性。
- RegularExpression?特性限制用戶可以輸入的字符。?在上述代碼中,Genre?和?Rating?僅可使用字母(禁用空格、數字和特殊字符)。
- Range?特性將值限制在指定范圍內。
- StringLength?特性設置字符串的最大長度,且可視情況設置最小長度。
讓 ASP.NET Core 強制自動執行驗證規則有助于提升應用的可靠性。?自動驗證模型有助于保護應用,因為添加新代碼時無需手動應用它們。
Razor 頁面中的“驗證錯誤”UI
運行應用并導航到“頁面/電影”。
選擇“新建”鏈接。?使用無效值填寫表單。?當 jQuery 客戶端驗證檢測到錯誤時,會顯示一條錯誤消息。
備注
可能無法在?Price?字段中輸入小數點或逗號。?若要使?jQuery 驗證支持使用逗號(“,”)表示小數點及使用非美國英語日期格式的非英語區域設置,必須執行使應用全球化的步驟。?有關詳細信息,請參閱其他資源。?目前只能輸入整數,例如 10。
?
請注意表單如何自動呈現每個包含無效值的字段中的驗證錯誤消息。?客戶端(使用 JavaScript 和 jQuery)和服務器端(若用戶禁用 JavaScript)都必定會遇到這些錯誤。
一項重要優勢是,無需在“創建”或“編輯”頁面中更改代碼。?在模型應用 DataAnnotations 后,即已啟用驗證 UI。?本教程中自動創建的 Razor 頁面自動選取了驗證規則(使用?Movie?模型類的屬性上的驗證特性)。?使用“編輯”頁面測試驗證后,即已應用相同驗證。
存在客戶端驗證錯誤時,不會將表單數據發布到服務器。?請通過以下一種或多種方法驗證是否未發布表單數據:
- 在?OnPostAsync?方法中放置一個斷點。?提交表單(選擇“創建”或“保存”)。?從未命中斷點。
- 使用?Fiddler 工具。
- 使用瀏覽器開發人員工具監視網絡流量。
服務器端驗證
在瀏覽器中禁用 JavaScript 后,提交出錯表單將發布到服務器。
(可選)測試服務器端驗證:
- 在瀏覽器中禁用 JavaScript。?如果無法在瀏覽器中禁用 JavaScript,請嘗試其他瀏覽器。
- 在“創建”或“編輯”頁面的?OnPostAsync?方法中設置斷點。
- 提交帶有驗證錯誤的表單。
-
驗證模型狀態是否無效:
以下代碼顯示了之前在本教程中設定其基架的“Create.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 特性。?驗證標記幫助程序用于顯示驗證錯誤。?有關詳細信息,請參閱驗證。
“創建”和“編輯”頁面中沒有驗證規則。?僅可在?Movie?類中指定驗證規則和錯誤字符串。?這些驗證規則將自動應用于編輯?Movie?模型的 Razor 頁面。
需要更改驗證邏輯時,也只能在該模型中更改。?將始終在整個應用程序中應用驗證(在一處定義驗證邏輯)。?單處驗證有助于保持代碼干凈,且更易于維護和更新。
使用 DataType 特性
檢查?Movie?類。?除了一組內置的驗證特性,System.ComponentModel.DataAnnotations?命名空間還提供格式特性。?DataType?特性應用于?ReleaseDate?和?Price?屬性。
[Display(Name = "Release Date")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; }[Range(1, 100)] [DataType(DataType.Currency)] public decimal Price { get; set; }DataType?特性僅提供相關提示來幫助視圖引擎設置數據格式(并提供特性,例如向 URL 提供?<a>?和向電子郵件提供?<a href="mailto:EmailAddress.com">)。?使用?RegularExpression?特性驗證數據的格式。?DataType?屬性用于指定比數據庫內部類型更具體的數據類型。?DataType?特性不是驗證特性。?示例應用程序中僅顯示日期,不顯示時間。
DataType?枚舉提供了多種數據類型,例如日期、時間、電話號碼、貨幣、電子郵件地址等。?應用程序還可通過?DataType特性自動提供類型特定的功能。?例如,可為?DataType.EmailAddress?創建?mailto:?鏈接。?可在支持 HTML5 的瀏覽器中為?DataType.Date?提供日期選擇器。?DataType?特性發出 HTML 5?data-(讀作 data dash)特性供 HTML 5 瀏覽器使用。?DataType?特性不提供任何驗證。
DataType.Date?不指定顯示日期的格式。?默認情況下,數據字段根據基于服務器的?CultureInfo?的默認格式進行顯示。
DisplayFormat?特性用于顯式指定日期格式:
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] public DateTime ReleaseDate { get; set; }ApplyFormatInEditMode?設置用于指定在顯示值進行編輯時需應用格式。?可能不希望某些字段具有此行為。?例如,在貨幣值中,可能不希望編輯 UI 中存在貨幣符號。
可單獨使用?DisplayFormat?特性,但通常建議使用?DataType?特性。?DataType?特性傳達數據的語義而不是傳達如何在屏幕上呈現數據,并提供 DisplayFormat 不具備的以下優勢:
- 瀏覽器可啟用 HTML5 功能(例如顯示日歷控件、區域設置適用的貨幣符號、電子郵件鏈接等)
- 默認情況下,瀏覽器將根據區域設置采用正確的格式呈現數據。
- 借助?DataType?特性,ASP.NET Core 框架可選擇適當的字段模板來呈現數據。?單獨使用時,DisplayFormat?特性將使用字符串模板。
注意:jQuery 驗證不適用于?Range?屬性和?DateTime。?例如,以下代碼將始終顯示客戶端驗證錯誤,即便日期在指定的范圍內:
?
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]通常,在模型中編譯固定日期是不恰當的,因此不推薦使用?Range?特性和?DateTime。
以下代碼顯示組合在一行上的特性:
?
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)]public decimal Price { get; set; }[RegularExpression(@"^[A-Z]+[a-zA-Z""'\s-]*$"), StringLength(5)]public string Rating { get; set; } }?
轉載于:https://www.cnblogs.com/djd66/p/8484209.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的ASP.NET CORE RAZOR :向 Razor 页面添加验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言string.h常用函数总结
- 下一篇: hive 调优(一)coding调优