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")]
これは大文字を許可するためにうまく機能します。しかし、それは完璧ではありません。この正規表現では、これらはすべて有効と見なされます。
- www.asp
- asp.net
- http://asp.net
- http://www.asp.net
- 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でテストしたところ、同じ結果が得られました