Asp.net core通過自定義特性實現雙端數據驗證的一些想法
asp.net core集成了非常方便的數據綁定和數據校驗機制,配合操作各種easy的vs,效率直接高到飛起。
通過自定義驗證特性(Custom Validation Attribute)可以實現對於數據校驗規則的極大擴展。
最近在寫前後端自定義驗證的時候,嘗試換了一種思路,這裡做簡單記錄:
> 一般而言,我們在自定義一個驗證特定的時候,會繼承ValidationAttribute
> 之後如果只 override bool IsValid(object value) 則僅實現後端校驗,無法實現前端校驗
> 如果要實現前端校驗,則步驟會更加複雜:
>> 首先額外繼承IClientModelValidator介面
>> 實現 void AddValidation(ClientModelValidationContext context) 方法,並填充內容
>> 還不算完,我們還得額外再補充jquery的前端校驗方法:
>>> $.validator.addMethod
>>> $.validator.unobtrusive.adapters.add
這是asp.net core 自定義特性實現雙端校驗的標配步驟,可以參考dudu站長的這篇文章://www.cnblogs.com/dudu/p/6812715.html
一直感覺這些步驟相對繁瑣,單獨的後端校驗和jquery前端校驗都很簡單,既然倆適配到一起這麼麻煩為啥不分開寫?
首先自定義特性僅實現後端驗證:
public class SimpleTestAttribute : ValidationAttribute { private static readonly Regex _noSpaceRegex = new Regex(@"/^[0-9]*$/", RegexOptions.Compiled); public override bool IsValid(object value) { string stringValue = Convert.ToString(value, CultureInfo.CurrentCulture); if (string.IsNullOrEmpty(stringValue)) { return true; } return _noSpaceRegex.IsMatch(stringValue); } }
然後model欄位添加特性標籤:
[SimpleTest(ErrorMessage = "請輸入大於0的數字")] public string validtest { get; set; }
之後是視圖層程式碼:
<div class="form-group"> <label asp-for="validtest" class="control-label"></label> <input asp-for="validtest" class="form-control simpletest"/> <!-- 注意 simpletest 寫到class里 --> <span asp-validation-for="validtest" class="text-danger"></span> </div>
以及視圖層jquery單獨前端校驗的腳本:
@section Scripts { @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} <script type="text/javascript"> $(function () { $.validator.addMethod("simpletest", function (value, element) { var score = /^[0-9]*$/; return this.optional(element) || (score.test(value)); }, "請輸入大於0的數字"); }); </script> }
最後是Controller實現:
[HttpPost] public IActionResult Edit(EditModel model) { if (!ModelState.IsValid) { return View(); // 顯示後端校驗提示資訊 } return RedirectToAction("Index"); }
自定義特性只校驗後端,前端用原始jquery程式碼寫就好,感覺這樣思路反倒更清晰(?捂臉。。)
歡迎各路大神賜教拍磚
參考://www.cnblogs.com/dudu/p/6812715.html
擴展閱讀://www.cnblogs.com/weiweithe/p/5268654.html