mvc4かみそりのテキストボックスに数字のみを許可する方法


83

郵便番号と携帯電話番号と住居番号の値をとる3つのテキストボックスがあります。Bellow postのjqueryを使用して、テキストボックスに数字のみを許可するソリューションを入手しました。

EditForテキストボックスに数字のみを受け入れさせたい

しかし、MVC4かみそりを使用しているので、データ注釈を使用してこれを行うことはできますか?


1
テキストボックスにデータを入力するときではなく、フォームを送信するときにデータ注釈が呼び出されるため、これを行うことはできません
Karthik Chintala 2013

それは事実ですが、HTML5入力タイプの検証ルールを使用できます(ブラウザーでサポートされている場合)。この質問シナリオで機能します。
ハブソンブロパ2013年

cssクラスでjQueryを使用する


@KarthikChintalaそれは正しくありません。データ注釈は、フォームをレンダリングするときに、クライアント側のjQuery検証とさまざまなフィールドの入力タイプを決定するためにも使用されます。
ProfK 2017年

回答:


102

HTML5のinputtype = numberで遊んでいました。すべてのブラウザでサポートされているわけではありませんが、タイプ固有の処理(たとえば数値)を処理する方法になると思います。かみそりで行うのは非常に簡単です(例はVBです)

@Html.TextBoxFor(Function(model) model.Port, New With {.type = "number"})

そして、リー・リチャードソンのおかげで、c#の方法

@Html.TextBoxFor(i => i.Port, new { @type = "number" }) 

質問の範囲を超えていますが、どのhtml5入力タイプでも同じアプローチを実行できます


9
別名@ Html.TextBoxFor(i => i.Port、new {@type = "number"})
Lee Richardson

2
数字ではなく文字である「-」や「+」も入力できます。
ブロンド氏2016年

これは、OperaMiniを除くすべての主要なブラウザで少なくとも部分的にサポートされています。
トビアスJ

「-」と「+」のほかに、「e」の文字を入力できます。Donal Laffertyが回答で指摘したように、データ注釈+正規表現を使用しました。
alejandro zuleta 2017

60

正規表現を使用します。例:

[RegularExpression("([1-9][0-9]*)", ErrorMessage = "Count must be a natural number")]
public int Count { get; set; }

2
これが答えになるはずです。

52
@Html.TextBoxFor(m => m.PositiveNumber, 
                      new { @type = "number", @class = "span4", @min = "0" })

Razorを使用するMVC5では、上記の例のように匿名オブジェクトに任意のhtml入力属性を追加して、入力フィールドに正の数のみを許可できます。


フロントエンド検証のための非常にきちんとしたソリューション。時間を節約してくれてありがとう@realaValoro :-)
Asif Mehmood

span4クラスはどこから来たのですか?
mischka

これは、テキストボックスにcssクラスを指定する方法のサンプルにすぎません。
diegosasw

15

テキストボックスにこのコードonkeypress="return isNumberKey(event)" を記述し、このための関数をすぐ下に示します。

<script type="text/javascript">
function isNumberKey(evt)
{
          var charCode = (evt.which) ? evt.which : event.keyCode;
          if (charCode != 46 && charCode > 31 
            && (charCode < 48 || charCode > 57))
             return false;

          return true;
}
</script>

JavaScriptイベントは、Firefox定義されていません

キープレスイベントはすべての携帯電話で利用できるわけではないため、これは多くのスマートフォンでは機能しません。
レポ2016年

それはMVC4のRAZRのために答えた
Shwet

9

DataType属性を使用してください。ただし、これは負の値を除くため、以下の正規表現はこれを回避します。

   [DataType(DataType.PhoneNumber,ErrorMessage="Not a number")]
   [Display(Name = "Oxygen")]
   [RegularExpression( @"^\d+$")]
   [Required(ErrorMessage="{0} is required")]
   [Range(0,30,ErrorMessage="Please use values between 0 to 30")]
    public int Oxygen { get; set; }

8

これは私のために働いた:

<input type="text" class="numericOnly" placeholder="Search" id="txtSearch">

Javacript:

//Allow users to enter numbers only
$(".numericOnly").bind('keypress', function (e) {
    if (e.keyCode == '9' || e.keyCode == '16') {
        return;
    }
    var code;
    if (e.keyCode) code = e.keyCode;
    else if (e.which) code = e.which;
    if (e.which == 46)
        return false;
    if (code == 8 || code == 46)
        return true;
    if (code < 48 || code > 57)
        return false;
});

//Disable paste
$(".numericOnly").bind("paste", function (e) {
    e.preventDefault();
});

$(".numericOnly").bind('mouseenter', function (e) {
    var val = $(this).val();
    if (val != '0') {
        val = val.replace(/[^0-9]+/g, "")
        $(this).val(val);
    }
});

キープレスイベントはすべての携帯電話で利用できるわけではないため、これは多くのスマートフォンでは機能しません。
レポ2016年

5

スクリプトでこの関数を使用し、テキストボックスの近くにスパンを配置してエラーメッセージを表示します

$(document).ready(function () {
    $(".digit").keypress(function (e) {
        if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) {
            $("#errormsg").html("Digits Only").show().fadeOut("slow");
            return false;
        }
    });
});

@Html.TextBoxFor(x => x.company.ContactNumber, new { @class = "digit" })
<span id="errormsg"></span>

簡単な解決策に賛成。なぜ彼らがそれを魅力のように機能する答えとしてマークしなかったのかわかりません
ImranNaqvi 2015

キープレスイベントはすべての携帯電話で利用できるわけではないため、これは多くのスマートフォンでは機能しません。
レポ2016年

3

can we do this using data annotations as I am using MVC4 razor ?

いいえ、あなたの質問を理解しているので、目立たない検証ではエラーのみが表示されます。最も簡単な方法は、jqueryプラグインを使用することです。

マスクされた入力プラグイン


2

これは、数字のみを入力できるJavaScriptです。

onkeypressテキストボックスのイベントを購読します。

@Html.TextBoxFor(m=>m.Phone,new { @onkeypress="OnlyNumeric(this);"})

これがそのJavaScriptです:

<script type="text/javascript">
function OnlyNumeric(e) {
            if ((e.which < 48 || e.which > 57)) {
                if (e.which == 8 || e.which == 46 || e.which == 0) {
                    return true;
                }
                else {
                    return false;
                }
            }
        }
</script>

それがあなたを助けることを願っています。


すべてのコードパスが値を返すわけではなく、私にとっては機能しません

キープレスイベントはすべての携帯電話で利用できるわけではないため、これは多くのスマートフォンでは機能しません。
レポ2016年

2

ゼロより大きい10進値の場合、HTML5は次のように機能します。

<input id="txtMyDecimal" min="0" step="any" type="number">

そして、かみそりのHTMLhelperでこれをどのように行いますか?
LarryBud 2017

Razorを使おうとしましたが、年齢を検索したところ、これほどクリーンな解決策が見つかりませんでした。
クリス

1

たぶん、[整数]データ注釈を使用できます(DataAnnotationsExtensionshttp //dataannotationsextensions.org/を使用する場合)。ただし、これは値が整数であるかどうかのみをチェックし、値が入力されているかどうかはチェックしません(したがって、[必須]属性も必要になる場合があります)。

Unobtrusive Validationを有効にすると、クライアント側で検証されますが、JavaScriptが無効になっている場合に備えて、POSTアクションでModelstate.Validを使用して拒否する必要があります。


0

DataType文字列を受け取る2番目のコンストラクタがあります。ただし、内部的には、これは実際にはUIHint属性を使用するのと同じです。

DataType列挙型は.NETFrameworkの一部であるため、新しいコアDataTypeを追加することはできません。最も近い方法は、を継承する新しいクラスを作成することですDataTypeAttribute。次に、独自のDataType列挙を使用して新しいコンストラクターを追加できます。

public NewDataTypeAttribute(DataType dataType) : base(dataType)
 { }

public NewDataTypeAttribute(NewDataType newDataType) : base (newDataType.ToString();

このリンクからもアクセスできます。ただし、同じようにJqueryを使用することをお勧めします。


0

こんにちは、次のことを試してください。

<div class="editor-field">
  <%: Html.TextBoxFor(m => m.UserName, new {onkeydown="return ValidateNumber(event);" })%>
  <%: Html.ValidationMessageFor(m => m.UserName) %>
</div>

脚本

<script type="text/javascript">
   function ValidateNumber(e) {
       var evt = (e) ? e : window.event;
       var charCode = (evt.keyCode) ? evt.keyCode : evt.which;
       if (charCode > 31 && (charCode < 48 || charCode > 57)) {
           return false;
       }
       return true;
   };

キープレスイベントはすべての携帯電話で利用できるわけではないため、これは多くのスマートフォンでは機能しません。
レポ2016年

0
@Html.TextBoxFor(x => x.MobileNo, new { @class = "digit" , @maxlength = "10"})

@section Scripts 
{
    @Scripts.Render("~/bundles/jqueryui")
    @Styles.Render("~/Content/cssjqryUi")

    <script type="text/javascript">
         $(".digit").keypress(function (e) {
            if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) 
            {
                $("#errormsg").html("Digits Only").show().fadeOut("slow");
                return false;
            }
         });
    </script>
}


-1
function NumValidate(e) {
    var evt = (e) ? e : window.event;
    var charCode = (evt.keyCode) ? evt.keyCode : evt.which;
    if (charCode > 31 && (charCode < 48 || charCode > 57)) {
        alert('Only Number ');
        return false;
    }    return true;
}  function NumValidateWithDecimal(e) {

var evt = (e) ? e : window.event;
var charCode = (evt.keyCode) ? evt.keyCode : evt.which;

if (!(charCode == 8 || charCode == 46 || charCode == 110 || charCode == 13 || charCode == 9) && (charCode < 48 || charCode > 57)) {
    alert('Only Number With desimal e.g.: 0.0');
    return false;
}
else {
    return true;
} } function onlyAlphabets(e) {
try {
    if (window.event) {
        var charCode = window.event.keyCode;
    }
    else if (e) {
        var charCode = e.which;
    }
    else { return true; }

    if ((charCode > 64 && charCode < 91) || (charCode > 96 && charCode < 123) || (charCode == 46) || (charCode == 32))
        return true;
    else
        alert("Only text And White Space And . Allow");
    return false;

}
catch (err) {
    alert(err.Description);
}} function checkAlphaNumeric(e) {

if (window.event) {
    var charCode = window.event.keyCode;
}
else if (e) {
    var charCode = e.which;
}
else { return true; }

if ((charCode >= 48 && charCode <= 57) || (charCode >= 65 && charCode <= 90) || (charCode == 32) || (charCode >= 97 && charCode <= 122)) {
    return true;
} else {
    alert('Only Text And Number');
    return false;
}}

2
ソリューションの簡単な説明はどうですか?
ジャックフランプ2017

通常、匿名コードのいくつかの行を投稿するのではなく、解決策を説明する方が良いでしょう。あなたは私が良い答えを書く方法を読むことができます、そしてまた完全にコードベースの答えを説明する
Anh Pham 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.