5

状況は次のとおりです。ここにURL用の大きなテキスト入力ボックスがあります:https ://asafaweb.com

ただし、これはURLの厳密な定義に準拠する必要はありません。スキームなしでアドレスを許可し、使いやすさのためにデフォルトでHTTPに設定します。たとえば、「stackoverflow.com」は有効なURLと見なされます。ただし、さまざまな理由で許可したくないURLもあります(つまり、ブラックリストに登録されているか、内部IPアドレス範囲です)。

入力の種類をデフォルトの「テキスト」ではなく「url」に設定して、モバイルデバイスのユーザーがURLコンテキスト用に設計されたキーボードを取得できるようにします(つまり、iOSでは「.com」ボタンが表示されます)。問題はこれを行うとすぐに、ASP.NET MVCにバンドルされているデフォルトの目立たないjQuery検証は、スキームを含むURLを予期するため、スキームのないURLサポートが機能しなくなります。

これはMVC4サイトであり、次のようなHTMLヘルパーがあります。

@Html.TextBoxFor(m => m.ScanUrl, new { type = "url" })

ScanUrl属性には、URLをスキャンできることを確認するために、すべての特注チェックを実行するカスタムValidationAttributeがあります。

jQueryの検証が介入せず、URLが厳密なURLであることを確認したい場合、既存の検証パターンを維持するにはどうすればよいですか?

4

3 に答える 3

8

このサイトのどこにも厳密なURL検証が必要ない場合は、jQuery ValidationがURLを検証する方法を変更するのが、それを処理する最も簡単な方法かもしれません。MVC 4に付属しているバージョンを使用している場合は、jquery.validate.jsの1034行目にあります。

プラグインスクリプトで正規表現を微調整するか、jQueryValidationが読み込まれた後にURL検証メソッドにパッチを適用することができます。

<script src="/Scripts/jquery.validate.js"></script>
<script>
  // To no-op url validation completely.
  jQuery.validator.methods.url = function(value, element) {
    return this.optional(element) || true;
  };

  // Or, continue validating everything else as previously, 
  //  but not require the protocol (double check my change to the regex...).
  jQuery.validator.methods.url = function(value, element) {
    return this.optional(element) || /^(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
  };    
</script>

後でパッチを適用する主な利点は、スクリプトの微調整されたバージョンに縛られず、カスタマイズされたURLバリデーターを失うことなく後でjQuery検証自体を更新できることです。それはおそらくあなたには明らかですが、後でこの答えを見つける他の人にとって役立つかもしれません。

于 2012-09-03T01:26:07.223 に答える
0

フォーカスアウト/変更にスキーマがない場合は、javascriptを使用して、入力のURLの前にスキーマを自動的に追加できます。

于 2012-09-01T03:00:05.477 に答える
0

また、jQuery Validationプラグインに、指定したセレクターに基づいて入力フィールドを選択的に無視するように指示することもできます。セレクターは、無視するすべての要素に追加するクラスである可能性がありclass="ignorejQueryValidate"ますtype="url"

Validationプラグインのメソッドに関するjQueryドキュメントignoreのオプションに関するセクションを参照してください。validate()

@using (Html.BeginForm("SomeAction", "SomeController", FormMethod.Post, new { id = "myForm"}))
{
    @Html.TextBoxFor(m => m.ScanUrl, new { type = "url", @class = "ignorejQueryValidate" })
}

$("#myForm").validate({
    ignore: ".ignorejQueryValidate"
});

また

@using (Html.BeginForm("SomeAction", "SomeController", FormMethod.Post, new { id = "myForm" }))
{
    @Html.TextBoxFor(m => m.ScanUrl, new { type = "url" })
}

$("#myForm").validate({
    ignore: "input[type=url]"
});
于 2012-09-04T01:48:56.093 に答える