2012-08-09 3 views
1

MVC3 프로젝트에서 사용자가 URL 입력을 텍스트 입력에 입력하고이를 엔터티에 데이터로 저장할 수있는 몇 가지보기가 있습니다.데이터 입력을 확인하는 것이 유효한 URL입니다.

입력이 유효하게 형성되었는지 확인해야합니다.

http://dataannotationsextensions.org/[Url] 주석을 사용하여 처음 시작했지만 몇 가지 이상한 이유로 사용자가 대문자를 입력하면 클라이언트 측 유효성 검사가 실패합니다. 따라서 사용자 유형을 입력 할 때 입력을 소문자로 만드는 jQuery 이벤트를 추가했다는 점을 경감하십시오. 사용자가 tinyUrl과 같은 URL 단축 서비스에 의해 단축 된 URL에 붙여 넣을 수 있고 번역을 위해 대문자가 필요하기 때문에이 방법이 최적이 아님을 알 수 있습니다.

그래서 나는 정규 표현식으로 대신했다 :

[RegularExpression(@"^((ht|f)tp(s?)\:\/\/|~/|/)?([\w]+:\[email protected])?([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://

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

을 앞에 추가 그러나 입력 된 URL이있는 경우 http:// 디스플레이 뷰에서 생성 된 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이 같은 어려운, 뷰에 DB에 저장하고 나타났다 URL을 보여주는 것이되지이며, 또한 잘 형성된 URL을 저장하는 사용자를 허용하지만, 또한 abbrevia 예 :

asp.net 
www.asp.net 

앞에 붙은 프로토콜을 포함하지 않아도됩니다.여기에 업데이트

당신은 내가 미쳤다고 생각하지 않는다 그래서 http://dataannotationsextensions.org/

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

에서 주석을 사용하여 내 ViewModel에 내 URL 필드의 정의이며, 여기에 사용 스크린 샷입니다 대문자 및 대문자 없음 지금까지 IE8과 크롬에서 테스트와 나는 대문자와 나를 위해 http://dataannotationsextensions.org/ 작품에서 같은 결과를 완벽하게 정상적으로

Screenshot

+0

5 가지 예 중 실제로 유효하지 않은 것은 어느 것입니까? 좋아, 그들은 모든 _resolve_되지 않을 수도 있습니다하지만 만약 당신이 멀리 Regex와 함께 그들을 피할 수있는 테스트를 원한다면. – Widor

+0

1과 5는 해당 주소로 이동할 수있는 방법이 없으므로 완전히 유효하지 않습니다. 5는 URL을 만들지 만 탐색 할 수는 없습니다. 2, 3, 4는 유효하지만 3과 4 만 가능합니다 (앞에 붙인 http : //는 탐색 가능합니다. http : //가없는 것은 위의 그림과 같이 잘못된 이동 가능한 URL을 생성합니다) 컨트롤러/액션/www.asp' –

답변

0

가 해결, 2 DLL을 DataAnnotationsExtensions.dll 및 DataAnnotationsExtensions.ClientValidation.dll을 http://dataannotationsextensions.org/에서 내가 있었다 버전을 사용하였습니다 1.0이고 [Url] 주석에서 대문자를 허용하지 않았습니다. 이 버전이 웹 사이트에서 데모되어 문제가 해결되었으므로 둘 모두에서 버전 1.1로 업데이트되었습니다.

[Url]을 사용하면 이제 대문자 허용은 물론 http://을 시행 할 수있게되었습니다.

[Url(false)]을 사용하면 사용자는 http://을 입력 할 필요가 없으며 코드에 추가 할 수 있습니다.

0

[Url]를 얻을. 그러나 어떤 이유로 당신이 그것을 사용하지 않는 경우는 정규식을 표절 수는 사용

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; } 
} 
+0

스크린 샷과 모델 정의로 위의 편집을 참조하십시오. –

+0

왜 URL 생성자에 false를 전달 했습니까? 프로토콜을 적용해야한다는 요구 사항과 모순됩니다. –

+0

두 시나리오를 모두 테스트하고있었습니다. 나는 절대적으로해야 할 때까지 사용자가 프로토콜을 입력하도록 강요하고 싶지 않다. 대부분의 사용자는'www.mybankname.com' 또는'myschoolname.edu'를 입력 할 것이다 –

관련 문제