1

MVC3プロジェクトには、ユーザーがテキスト入力にURLを入力して、エンティティにデータとして保存できるビューがいくつかあります。

入力が有効に形成されたURLであることを検証する必要があります。

最初はhttp://dataannotationsextensions.org/[Url]の注釈を使用することから始めましたが、奇妙な理由で、ユーザーが大文字を入力するとクライアント側の検証が失敗します。そこで、ユーザーが入力するときに入力を小文字に強制するjQueryイベントを追加したことを軽減します。ユーザーはtinyUrlなどのURL短縮サービスによって短縮されたURLを貼り付けることができ、これらの大文字は翻訳に必要であるため、これも最適ではないことがわかります。

そこで、代わりに正規表現を使用しました。

[RegularExpression(@"^((ht|f)tp(s?)\:\/\/|~/|/)?([\w]+:\w+@)?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((/?\w+/)+|/?)(\w+\.[\w]{3,4})?((\?\w+=\w+)?(&\w+=\w+)*)?", ErrorMessage = "Please enter a valid Url")]

これは大文字を許可するためにうまく機能します。しかし、それは完璧ではありません。この正規表現では、これらはすべて有効と見なされます。

  1. www.asp
  2. asp.net
  3. http://asp.net
  4. http://www.asp.net
  5. http://www.asp

ご覧のとおり、これらの一部は実際には有効ではありません。

これらのURLの最大の問題は、URLを表示ビューに表示し直す場合です。URLテキストの前にURLが付加されていない場合、http://ビューに作成されるリンクは次のようになります。

http://www.mydomain.com/controller/action/www.asp 

また

http://www.mydomain.com/controller/action/asp.net

どちらも明らかに無効です。

たとえば、URLにhttp://先頭が追加されていない場合、Razorコードのこのビットは上記の2つのようなリンクを作成します

....
<a href="@item.Link" target="blank">@item.LinkName</a>
...

ただし、入力http://されたURLが先頭に追加されている場合、表示ビューで生成されたURLは、実際には次のような実際のURLです。

http://www.asp.net
http://asp.net
http://www.asp - this is actually an invalid address as well but it renders out correctly.

確かに、データベースに保存されてからビューに表示されたURLを表示することは、これほど難しくはありません。また、ユーザーが整形式のURLを保存できるようにするだけでなく、次のように省略します。

asp.net
www.asp.net

付加されたプロトコルを含める必要はありません。

アップデート

http://dataannotationsextensions.org/のアノテーションを使用したViewModelのUrlフィールドの定義は次のとおりです。

[Required]
[StringLength(128)]
[Url(false)] // false denotes whether the protocol is required or not
public string URL { get; set; }

だから、私がおかしいとは思わないでしょう。これは大文字を使用し、大文字を使用しないスクリーンショットです。これまでにIE8とChromeでテストしたところ、同じ結果が得られました

スクリーンショット

4

2 に答える 2

0

[Url]http://dataannotationsextensions.org/から は、大文字を使用しても問題なく機能します。しかし、何らかの理由でそれを使用したくない場合は、使用する正規表現を盗用することができます。

public class MyViewModel
{
    [RegularExpression(@"^(https?|ftp):\/\/(((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-fA-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-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-fA-F]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-fA-F]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-fA-F]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-fA-F]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$")]
    public string Url { get; set; }
}
于 2012-08-09T15:54:27.380 に答える
0

解決しました。私が使用していたhttp://dataannotationsextensions.org/の2つのDLLDataAnnotationsExtensions.dllとDataAnnotationsExtensions.ClientValidation.dllはバージョン1.0であり、[Url]注釈で大文字にすることはできませんでした。これはWebサイトでデモされたバージョンであり、問​​題が修正されたため、両方でバージョン1.1に更新しました。

を使用すると、大文字を許可するだけでなく、絶対に必要な場合に[Url]強制できるようになります。http://

を使用[Url(false)]すると、ユーザーは入力する必要http://がなくなり、コードの前に追加できます。

于 2012-08-09T17:02:36.200 に答える