5

DataAnnotation を使用してクライアント側でフォームを検証する ASP.NET MVC Web ページがあります。ビュー クラスの 1 つに、次のようなプロパティがあります。

[StringLength(100, MinimumLength = 3, ErrorMessage = "Länken måste vara mellan 3 och 100 tecken lång")]
[Display(Name = "Länk")]
[RegularExpression(@"^(http(s)?://([\w-]+.)+[\w-]+(/[\w- ./?%&=])?)?$", ErrorMessage="Länkgen är inte giltlig")]
        public string Url { get; set; }

ビューでは、プロパティに次のコードを使用します。

@Html.LabelFor(c => c.Url, true)
@Html.TextBoxFor(c => c.Url, new { @class = "tb1", @Style = "width:400px;" })
@Html.ValidationMessageFor(model => model.Url)

次のような URL を貼り付ける場合:

http://95rockfm.com/best-voicemail-giving-play-by-play-of-car-accident/

ウェブページがロックアップし、ウェブページで何もできなくなります。ただし、これを貼り付けた場合:

http://95rockfm.com/best-voicemail-giving-play-by-play-of-car-accident

それはうまく動作します。

これらの JavaScript ファイルは、Web ページの下部に含まれています。

<script type="text/javascript" src="/Scripts/jquery.qtip.min.js"></script>
<script src="/Scripts/jquery-1.7.1.min.js"></script>
<script src="/Scripts/jquery-ui-1.8.20.min.js"></script>
<script src="/Scripts/jquery.validate.min.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.min.js"></script>

IE と Chrome の両方でまったく同じ問題が発生します。ただし、IE が戻ってきて、スクリプトに時間がかかりすぎて、スクリプトを停止するボタンが表示されたと表示されます。ただし、入力制御を切り替えると、スクリプトが再度実行され、Web ページが表示されます。

私はカスタムのものを使用していないのに、なぜこれを取得するのですか?

4

2 に答える 2

5

.正規表現では、任意の文字と一致します (実際、このピリオドは、URL のドメインの後のスラッシュと一致します)。ピリオドに一致させるには、エスケープするか、文字クラスに入れる必要があります。そのようです:

@"^(http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=])?)?$"

とか、ぐらい:

@"^(http(s)?://([\w-]+[.])+[\w-]+(/[\w- ./?%&=])?)?$"

そうしないと、パターンが一致するものを見つけることができず、ネストされた繰り返しがあり、指数関数的に可能な組み合わせがあります。nemesv がコメントでリンクしたように、これは壊滅的なバックトラッキングにつながります。ただし、グループ内のリテラルピリオドを一致させる場合、グループ全体の各繰り返しはピリオドで終了する必要があるため、指数関数的な量の組み合わせはありません。

「組み合わせの指数関数的な量」が何を意味するかを確認するために、私の2つの以前の回答にリンクします(実際には、今日からの1つ):

ただし、もう 1 つ、パターンが失敗する理由 (壊滅的なバックトラッキングは、ほとんどの場合、マッチの失敗の問題です): 最初のスラッシュの後に 1 文字しか必要としません。+おそらく、任意の長さのパスとクエリ文字列を許可したいので、その文字クラスに a を追加します。

@"^(http(s)?://([\w-]+[.])+[\w-]+(/[\w- ./?%&=]+)?)?$"

ただし、一般的に、確立された URL 正規表現パターンをグーグルで検索するのではなく、車輪を再発明する必要はありません。

于 2013-09-22T20:34:31.097 に答える
2

MVC には、次を使用した URL 検証が既にありますUrlAttribute

[Url]
public string Url { get; set; }

MVC 4 を使用している場合は、HTML 5<input type="url">要素も作成されます。

クライアント側の検証では、 jQuery Validation の URL ルールが使用されます。これは正規表現のままですが、はるかに優れたものです (たとえば、より多くの Unicode 文字をサポートしています)。

于 2013-09-24T12:31:35.103 に答える