MVC學習系列——Model驗證擴展

来源:http://www.cnblogs.com/xuliang1992/archive/2016/03/28/5329487.html
-Advertisement-
Play Games

MVC中,實現了前端後端的驗證。 前端驗證。步驟: web.config這兩個得開啟: JS設置 第一步:引入頁面js 第二步:BundleConfig類,得有 也就是這三個js 前端驗證,在MVC中的實現: 在Model上面加一些特性,都在System.ComponentModel.DataAnn ...


     MVC中,實現了前端後端的驗證。

前端驗證。步驟:

web.config這兩個得開啟:

    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />

JS設置

第一步:引入頁面js

@Scripts.Render("~/bundles/jqueryval")

第二步:BundleConfig類,得有

1  bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
2                         "~/Scripts/jquery.validate*"));

也就是這三個js

前端驗證,在MVC中的實現:

在Model上面加一些特性,都在System.ComponentModel.DataAnnotations中,比如Required  range等。

MVC中的HtmlHelp會分析這些特性,載入一下data-XX.

比如:

1   [Required]
2   public string Gender { get; set; }
1  @Html.EditorFor(x => x.Gender)

生成的html

1 <input class="text-box single-line" data-val="true" data-val-required="Gender 欄位是必需的。" id="Gender" name="Gender" type="text" value="">

然後根據相關JS自動實現前端驗證。

伺服器端驗證:

 在mvc中的實現:在Model上面加一些特性,都在System.ComponentModel.DataAnnotations中,比如Required  range等。

 1  [HttpPost]
 2         public ActionResult CreateStudent(StudentViewModel model)
 3         {
 4 
 5             ModelState.AddModelError("A", "AAAAA");
 6             ModelState.AddModelError("B", "BBBBB");
 7             ModelState.AddModelError("C", "CCCCC");
 8             ModelState.AddModelError("D", "DDDDD");
 9 
10             return View();
11         }

在ModelBinder過程中,開啟了伺服器端的驗證。同時把驗證不通過信息以鍵值對的方式,傳值給ModelState中

錯誤信息的呈現: 

 @Html.ValidationSummary(false)

是否隱藏錯誤信息:false即不隱藏錯誤信息,true即隱藏錯誤信息

1 @Html.ValidationMessageFor(x => x.Name)
2 @Html.ValidationMessage("Name")

第一個是lamda表達式,第二個是一般形式,作用是一樣的。

都是呈現對應錯誤的(根據key,呈現對應的value)

 

 

自定義ValidationAttribut(僅針對伺服器端的驗證) 

1:針對一個屬性 

新建類MyValidationAttribute,繼承ValidationAttribute

 1  public class MyValidationAttribute : ValidationAttribute
 2     {
 3         public MyValidationAttribute()
 4         {
 5             ErrorMessage = "The Name Must be Zhangsan";
 6         }
 7         public override bool IsValid(object value)
 8         {
 9             if (value==null)
10             {
11                 return false;
12             }
13             string result = value.ToString();
14             //判斷是否有值
15             if (string.IsNullOrEmpty(result))
16             {
17                 return false;
18             }
19 
20             if (result=="Zhangsan")
21             {
22                 return true;
23             }
24 
25             return false;
26         }
27     }

應用:

1 public class StudentViewModel
2     {
3         public string ID { get; set; }
4         [MyValidationAttribute]
5         public string Name { get; set; }
6         [Required]
7         public string Gender { get; set; }
8     }

View:

 1 <div>
 2     @using (Html.BeginForm())
 3     {
 4         @Html.ValidationSummary(false)
 5         <fieldset>
 6             <legend>UserInfo</legend>
 7             <div class="editor-label">
 8                 @Html.LabelFor(x => x.Name)
 9             </div>
10             <div class="editor-field">
11                 @Html.EditorFor(x => x.Name)
12                 @Html.ValidationMessageFor(x => x.Name)
13                 @Html.ValidationMessage("Name")
14             </div>
15 
16             <div class="editor-label">
17                 @Html.LabelFor(x => x.Gender)
18             </div>
19             <div class="editor-field">
20                 @Html.EditorFor(x => x.Gender)
21                 @Html.ValidationMessageFor(x => x.Gender)
22             </div>
23         </fieldset>
24         <input type="submit" value="提交" />
25     }
26 </div>

效果:

2:複雜的業務邏輯

類StudentViewModel繼承介面 IValidatableObject

 public class StudentViewModel: IValidatableObject
    {
        public string ID { get; set; }
        [MyValidationAttribute]
        public string Name { get; set; }
        [Required]
        public string Gender { get; set; }

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (!string.IsNullOrEmpty(Name))
            {
                if (Name=="Zhangsan" && Gender=="Nan")
                {
                    yield return new ValidationResult("Zhangsan and Gender is Nan,Which is wrong!");
                }
            }
        }
    }

效果圖:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 交叉編譯:tar xjf freetype-2.4.10.tar.bz2 ./configure --host=arm-linuxmakemake DESTDIR=$PWD/tmp install find -name stdio.h 平時使用#include<stdio.h>路徑 ./arm-li ...
  • 例子 1.編譯free_type 配置 ./configure 編譯 make 安裝 sudo make install gcc -o example1 example1.c error: freetype/config/ftheader.h: No such file or directoryex ...
  • 一、shell 電腦硬體的直接控制者是操作系統的內核(kernel),因為內核的重要性,所以作為用戶的我們是無法直接操作內核的,所以我們需要shell調用應用程式或者雙擊打開安裝的應用軟體與內核之間進行通信。 shell就相當於是一個介面,連接程式與內核;或者可以說shell是一個辦公桌,給工作的 ...
  • 用著.NET Framework,發現了CodeDom的先天性缺陷,心裡百般難受。 不知道 CodeDom 是什麼的請看這裡 CodeDom_百度百科 這裡有CodeDom非常全的中文教程 CodeDOM - 隨筆分類 - lichdr - 博客園 首先說,CodeDom的思想非常好,把代碼當作研究 ...
  • 每次寫東西都不知道怎麼去開頭.因為一想到要寫東西.腦子裡面浮現出來的開頭就太多. 進園子很久從開始只是關註別人講的技術,別人講的基礎,到現在更多的去看大家的隨筆和新聞.這兩年我從零基礎的外行人逐漸進入了這個行業. 看了很多隨筆.很多人都和我一樣算是半路出家.我大學畢業做過機票.做過旅游.做過水電安裝 ...
  • 在編寫程式時經常會使用到調用可執行程式的情況,本文將簡單介紹C#調用exe的方法。在C#中,通過Process類來進行進程操作。 Process類在System.Diagnostics包中。 示例一 using System.Diagnostics; Process p = Process.Star ...
  • 有時候,我們的項目涉及到多種風格,我們可以通過擴展RazorViewEngine,這樣就可以保持後臺代碼不發生變化。 新建類ThemeViewEngine繼承於RazorViewEngine Global類中,註冊這種引擎 web.config配置具體風格: 項目文件結構: View: Americ ...
  • 在之前的文章中,我們使用的都是持久連接,但是使用持久連接的話,這種模擬socket的形式使用起來還是很不方便的,比如只有一個唯一的 OnReceived方法來處理業務邏輯,如下圖: 但是在singlaR體系中並不是這樣,我們還有更加平易近人的一個類似RPC的Hub層,如下圖一樣: 是不是很好奇??? ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...