18

Piszę to pytanie tutaj, próbując znaleźć odpowiedź na dwa dni.Sprawdzanie adresu URL mvc4

zasadniczo tutaj jest to, co się dzieje.

Mam właściwość w viewmodel następująco

[Required(ErrorMessage = "Required Field")] 
[Url(ErrorMessage="Please enter a valid url")] 
[DisplayName("Website")] 
public string web { get; set; } 

w widoku, mam ten

@Html.EditorFor(model => model.web, new { AutoCompleteType = "Disabled", autocomplete = "off" }) 

teraz problem leży w jaki sposób wprowadzania tekstu dla tego pola jest zatwierdzone w Strona klienta. pole musi zawsze mieć prefiks protokołu, w przeciwnym razie traci ważność.

jaki jest najlepszy sposób na naprawienie tego problemu?

Wielkie dzięki

Odpowiedz

30

Można to zrobić za pomocą DataAnnotationsExtensions library. Mają one UrlAttribute, które można skonfigurować do sprawdzania tylko wtedy, gdy określony jest protokół. Ten atrybut zapewnia również sprawdzanie poprawności po stronie klienta. Można zobaczyć przykład takiego zachowania tutaj: http://dataannotationsextensions.org/Url/Create

Można użyć tego atrybutu następująco:

using System.ComponentModel.DataAnnotations; 

namespace DataAnnotationsExtensions.Core 
{ 
    public class UrlEntity 
    { 
     [Url] 
     [Required] 
     public string Url { get; set; } 

     [Url(UrlOptions.OptionalProtocol)] 
     [Required] 
     public string UrlWithoutProtocolRequired { get; set; } 

     [Url(UrlOptions.DisallowProtocol)] 
     [Required] 
     public string UrlDisallowProtocol { get; set; } 
    } 
} 

do swoich celów, pierwsza opcja wystarczy.

Pakiet tej biblioteki (z ASP.NET MVC wsparcia zestawie) można znaleźć na Nuget: Install-Package DataAnnotationsExtensions.MVC3

Uwaga: ten również działa dobrze z ASP.NET MVC 4

+2

Cześć, dziękuję za odpowiedź. Próbowałem użyć '[Url (UrlOptions.OptionalProtocol)]'. ale aby 'UrlOptions' był dostępny, muszę dodać' using DataAnnotationsExtensions', wtedy 'Url' staje się niejednoznaczny. aby to poprawić, użyłem '[DataAnnotationsExtensions.Url (UrlOptions.OptionalProtocol)]' ale nie sprawdza się w interfejsie użytkownika. – Amila

+1

OK, dopóki nie znajdę tego, co robię źle w DataAnnotationsExtensions, zamierzam połączyć odpowiedzi. Wyjąłem wyrażenie regularne dla opcjonalnego protokołu z [link] (http://dataannotationsextensions.org/Url/Create) i użyłem adnotacji danych wyrażeń regularnych do sprawdzania poprawności. teraz działa dobrze. Ale chciałbym użyć innych rozszerzeń adnotacji, które są dostępne w DataAnnotationExtensions. więc muszę dowiedzieć się, co się dzieje – Amila

+0

@Amila Miałem ten sam problem. Zamiast tego użyłem tej regularnej ekscesji. Nie wszystkie obejmują, ale wykonują zadanie "[RegularExpression ("^[(http: s)?): \\/\\/(www \\.)? A-zA-Z0-9 @:% ._ \\ + ~ # =] {2,256} \\. [Az] {2,6} \\ b ([- a-zA-Z0-9 @:% _ \\ +. ~ #? & = = * *) $ ")]' – Lsakurifaisu

0

Nie jestem pewien, czy w pełni rozumiem pytanie. Czy próbujesz sprawdzić poprawnie utworzone adresy URL? Jeśli więc można zaimplementować wyrażenie regularne DataAnnotation następująco:

[RegularExpression(@"^http(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$", ErrorMessage = "My Error Message")] 
+0

To nie działa. Żadne z wypróbowanych przeze mnie wyrażeń regularnych URL-a, dodanych jako adnotacja danych MVC, nie działa. –

+0

Ten wydaje się działać dla mnie [RegularExpression ("^ [(http: s)?): \\/\\/(www \\.)? A-zA-Z0-9 @:% ._ \\ + ~ # =] {2,256} \\. [Az] {2,6} \\ b ([- a-zA-Z0-9 @:% _ \\ +. ~ #? & = = * *) $ ")] – Lsakurifaisu