2022年5月6日 星期五

[研究][ASP.NET]輸入最小、最大長度、計算字數

[研究][ASP.NET]輸入最小、最大長度、計算字數

2022-05-04

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C#

********************************************************************************

使用 HTML5

HTML 的 input 標籤 (HTML Tag) 有 maxlength 可以限制輸入的最大長度 (全形、半形都算1個),長度到達就無法再輸入。

例如最大 50 字: 

<input type="text" maxlength="50"> 

但 input 標籤沒有 minlength 限制輸入最短長度。

到了 HTML5,input 標籤多了 pattern 屬性,可以使用正規運算式 (正規表示式,Regular Expression) 限制輸入格式,包含最小、最大長度;但 pattern 僅支援 input 在 type 為 text, search, tel, url, email, password 時才會生效。

至少12碼的密碼,限制使用大小寫英文和數字 

<input type="password" pattern="[a-zA-Z0-9]{12,}"> 

必須至少12碼,組成須含英文大小寫、數字以及特殊符號@#$%^&+=

<input type="password" pattern="^.*(?=.{12,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$"> 

公司統編

<input type="text" pattern="\d{8}"> 

句點表示符合除「\r」「\n」之外的任何單個字元。至少50字,至多200字。

required="required" 是 HTML5 的必填設定,離開填寫欄位時會進行檢查

title 也是 HTML5 的屬性,條件不滿足時,會顯示 title 設定的文字 (title 不設定會有預設顯示的文字)

<input type="text" required="required" title="50~200個字" pattern=".{50,200}"> 

IPv4 的 IP address

至少12碼的密碼,限制使用大小寫英文和數字 

<input type="text" pattern="^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$"> 

HTML5 Pattern網站 有些可以參考


一些常用的

[A-Za-z]+$   //由26個英文字母組成的字符串
^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$  //非正浮點數(負浮點數 + 0)
^((-\\d+)|(0+))$   //非正整數(負整數 + 0)
^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$ //正浮點數
^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ //負浮點數
^(-?\\d+)(\\.\\d+)?$   //浮點數
^-?\\d+$    //整數
^-[0-9]*[1-9][0-9]*$   //負整數
^[0-9]*[1-9][0-9]*$   //正整數
^[A-Z]+$   //由26個英文字母的大寫組成的字符串
^[A-Za-z0-9]+$   //由數字和26個英文字母組成的字符串
^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$     //email地址
^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$  //url網址
^[a-z]+$   //由26個英文字母的小寫組成的字符串
^\\d+$   //非負整數(正整數 + 0)
^\\d+(\\.\\d+)?$  //非負浮點數(正浮點數 + 0)
^\\w+$   //由數字、26個英文字母或者下劃線組成的字符串

********************************************************************************

使用 JavaScript

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <script type="text/javascript">
        function checkLength(which) {
            var maxChars = 10; //
            if (which.value.length > maxChars) {
                alert("您出入的字數超多限制!");
                // 超過長度的切掉
                which.value = which.value.substring(0, maxChars);
                return false;
            }
            else {
                var curr = maxChars - which.value.length; //減去當前輸入的
                document.getElementById("CountLength").innerHTML = curr.toString();
                return true;
            }
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <asp:TextBox ID="TextBox1" runat="server" onkeyup="checkLength(this);">
        </asp:TextBox>
        <br />
        限制字數為:10 剩餘字數:<span id="CountLength" style="color:red;">10</span>
        <br />
        <asp:Button ID="Button1" runat="server" Text="Button" />
    </form>
</body>

</html>


結果



********************************************************************************

使用ASP.NET前端

ASP.NET 有一堆驗證控制項 ( ASP.NET Validation controls )

https://docs.microsoft.com/zh-tw/previous-versions/visualstudio/design-tools/expression-studio-4/cc295349(v=expression.40)

範例

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" 
    CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />
        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" ControlToValidate="TextBox1"
            runat="server" ErrorMessage="必填" ForeColor="Red"></asp:RequiredFieldValidator>
        <asp:RangeValidator ID="RangeValidator1" ControlToValidate="TextBox1"
            runat="server" MinimumValue="1" MaximumValue="10" Display="Dynamic"
            Type="Integer" EnableClientScript="false" Text="限填數值1~10" ForeColor="Red"
            ErrorMessage="限填1~10"></asp:RangeValidator>
        <br />
        <asp:Button ID="Button1" runat="server" Text="Button" />
    </form>
</body>
</html>

Default.aspx.cs

using System;
using System.Web.UI;

namespace WebApplication1
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            UnobtrusiveValidationMode = UnobtrusiveValidationMode.None;
        }
    }
}

執行後,輸入文字,按下按鈕就會進行檢查


若沒有 UnobtrusiveValidationMode = UnobtrusiveValidationMode.None; 這行,按下按鈕會出現
WebForms UnobtrusiveValidationMode 需要 'jquery' 的 ScriptResourceMapping。請加入 ScriptResourceMapping 命名的 jquery (區分大小寫)。
詳情請看這篇

[研究][ASP.NET]WebForms UnobtrusiveValidationMode 需要 'jquery' 的 ScriptResourceMapping。請加入 ScriptResourceMapping 命名的 jquery (區分大小寫)。

<asp:RangeValidator 控制項若有 Text 屬性,不符合時會顯示 Text 的文字;若無 Text 屬性,則顯示 ErrorMessage 的文字。若 Text 和 ErrorMessage 屬性都無設定,不符則無任何警告文字。

檢視執行結果的 HTML Source 
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>
</title></head>
<body>
<form method="post" action="./Default.aspx" onsubmit="javascript:return WebForm_OnSubmit();" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="s0Jkz5fEWGLMx/eMhQHJb1WRTvLZrnh4FWyUBZvsZC4ENAutfgfWJ3QMw1zEpSwkibYslwBpAW6zIQyzvnNDmgsbSiTKnZP0d3sABEguFFU=" />
</div>
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
</script>
<script src="/WebResource.axd?d=pynGkmcFUV13He1Qd6_TZFnQ9YSlnhJIvDm4HmJxwKZiIDqBSJFyG6PIOw7sGECyzL4G-6NpV94zXuh9i5IE7w2&amp;t=637814941746327080" type="text/javascript"></script>
<script src="/WebResource.axd?d=x2nkrMJGXkMELz33nwnakLqBBmQMcs-as2cAOI3jJn4JzVLzuY5OMQOg-8QJpzo8AWrXjAaxfotJYfXA3Vq2RL_TSZwByL4WsEZ3dIafB0Q1&amp;t=637814941746327080" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
function WebForm_OnSubmit() {
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) return false;
return true;
}
//]]>
</script>
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="CA0B0334" />
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="IyLHGM9ZqsaxhCXT0dFu0cKHtl/5BF0dxCAuqRPOP1WWGT8yeI/Q+1CVQ7Iu4ew3c5ZY6fIRg9d5DS3ZcaswtJOEuh8yCzFk10oWsrjkJSOlDK0abj8k5PNj7j4DUfSNsvqFwhNB9XWvdaYmKxnUVg==" />
</div>
<input name="TextBox1" type="text" value="a" id="TextBox1" /><br />
<span id="RequiredFieldValidator1" style="color:Red;visibility:hidden;">必填</span>
<span id="RangeValidator1" style="color:Red;">限填數值1~10</span>
<br />
<input type="submit" name="Button1" value="Button" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;Button1&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" id="Button1" />
<script type="text/javascript">
//<![CDATA[
var Page_Validators = new Array(document.getElementById("RequiredFieldValidator1"));
//]]>
</script>
<script type="text/javascript">
//<![CDATA[
var RequiredFieldValidator1 = document.all ? document.all["RequiredFieldValidator1"] : document.getElementById("RequiredFieldValidator1");
RequiredFieldValidator1.controltovalidate = "TextBox1";
RequiredFieldValidator1.errormessage = "必填";
RequiredFieldValidator1.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid";
RequiredFieldValidator1.initialvalue = "";
//]]>
</script>
<script type="text/javascript">
//<![CDATA[
var Page_ValidationActive = false;
if (typeof(ValidatorOnLoad) == "function") {
ValidatorOnLoad();
}
function ValidatorOnSubmit() {
if (Page_ValidationActive) {
return ValidatorCommonOnSubmit();
}
else {
return true;
}
}
//]]>
</script>
</form>
</body>
</html>

其時驗證控制項 ( ASP.NET Validation controls ) 被 IIS 轉成 JavaScript,屬於前端程式。

********************************************************************************

因為前端的程式碼,是可被駭客繞過的,所以不管前端是否有程式或屬性進行限制,Server 端程式仍要再建查一次。

********************************************************************************

使用ASP.NET後端

參考這裡有範例

Regex.IsMatch 方法 (System.Text.RegularExpressions) | Microsoft Docs
https://docs.microsoft.com/zh-tw/dotnet/api/system.text.regularexpressions.regex.ismatch?view=net-6.0

(完)

相關

[研究]HTML5必填欄位檢查 required
https://shaurong.blogspot.com/2022/04/html5-required.html

[研究][ASP.NET][JavaScript]離開填寫欄位時,檢查必填並彈出alert對話盒視窗
https://shaurong.blogspot.com/2022/04/aspnetjavascriptalert.html

[研究] NuGet 對 jQuery.Validation 1.19.2 安裝測試
https://shaurong.blogspot.com/2020/08/nuget-jqueryvalidation-1192.html

[研究]HTML5 的 input 標籤的 type 屬性的各種值
https://shaurong.blogspot.com/2022/04/html5-input-type.html

[研究][ASP.NET]HTML5 的 input 標籤的 type 屬性的 日期、月曆測試
https://shaurong.blogspot.com/2022/04/html5-input-type_12.html

規則運算式語言 - 快速參考 | Microsoft Docs
https://docs.microsoft.com/zh-tw/dotnet/standard/base-types/regular-expression-language-quick-reference

使用規則運算式 - Visual Studio (Windows) | Microsoft Docs
https://docs.microsoft.com/zh-tw/visualstudio/ide/using-regular-expressions-in-visual-studio?view=vs-2022

.NET 規則運算式 | Microsoft Docs
https://docs.microsoft.com/zh-tw/dotnet/standard/base-types/regular-expressions

.NET 規則運算式中的字元類別 | Microsoft Docs
https://docs.microsoft.com/zh-tw/dotnet/standard/base-types/character-classes-in-regular-expressions

Regex.IsMatch 方法 (System.Text.RegularExpressions) | Microsoft Docs
https://docs.microsoft.com/zh-tw/dotnet/api/system.text.regularexpressions.regex.ismatch?view=net-6.0

.NET 規則運算式中的字元逸出 | Microsoft Docs
https://docs.microsoft.com/zh-tw/dotnet/standard/base-types/character-escapes-in-regular-expressions

其他還有很多
https://www.google.com/search?q=%E6%AD%A3%E8%A6%8F%E9%81%8B%E7%AE%97%E5%BC%8F+%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%A4%BA%E5%BC%8F+Regular+Expression+site:microsoft.com


沒有留言:

張貼留言