18

Sto scrivendo questa domanda qui dopo aver provato a trovare una risposta per due giorni.convalida url mvc4

fondamentalmente ecco cosa sta succedendo.

ho una proprietà nel ViewModel come segue

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

nella vista, ho questa

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

ora il problema risiede nel modo in cui il testo di input per questo campo viene convalidato nel dalla parte del cliente. il campo deve avere sempre il prefisso del protocollo, altrimenti diventa non valido.

qual è il modo migliore per risolvere questo problema?

Molte grazie

risposta

30

Si può fare questo con il DataAnnotationsExtensions library. Hanno un UrlAttribute che puoi configurare per validare solo quando viene specificato un protocollo. Questo attributo fornisce anche la convalida sul lato client. Potete vedere un esempio di questo comportamento qui: http://dataannotationsextensions.org/Url/Create

È possibile utilizzare questo attributo come segue:

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

Per i vostri scopi, la prima opzione è sufficiente.

Il pacchetto di questa libreria (con il supporto di ASP.NET MVC incluso) può essere trovato NuGet: Installare-Pacchetto DataAnnotationsExtensions.MVC3

Nota: questo funziona anche bene con ASP.NET MVC 4

+2

Ciao, grazie per la tua risposta. Ho provato a usare '[Url (UrlOptions.OptionalProtocol)]'. ma affinché 'UrlOptions' sia disponibile, devo aggiungere' using DataAnnotationsExtensions', quindi 'Url' diventa ambiguo. per correggere ciò, ho usato '[DataAnnotationsExtensions.Url (UrlOptions.OptionalProtocol)]' ma non è valido nel front-end. – Amila

+1

Ok, fino a quando non troverò che cosa sto sbagliando con DataAnnotationsExtensions, ho intenzione di combinare le risposte. Ho acquisito l'espressione regolare per il protocollo facoltativo da [collegamento] (http://dataannotationsextensions.org/Url/Create) e ho utilizzato l'annotazione dei dati delle espressioni regolari per la convalida. ora funziona bene. Ma mi piacerebbe utilizzare le altre estensioni di annotazione fornite in DataAnnotationExtensions. quindi devo capire cosa sta succedendo – Amila

+0

@Amila ho avuto lo stesso problema. Ho usato invece questa espressione regolare. Non tutto ciò che comprende ma fa il lavoro '[RegularExpression ("^[(http (s)?): \\/\\/(www \\.)? A-zA-Z0-9 @:% ._ \\ + ~ # =] {2256} \\ [az] {2,6} \\ b. ([- a-zA-Z0-9 @:.?% _ \\ + ~ # & // =] *) $ ")]' – Lsakurifaisu

0

Non sono sicuro se ho capito completamente la questione. Stai provando a convalidare gli URL correttamente formati? Se è così si potrebbe implementare un'espressione regolare DataAnnotation come segue:

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

Questo non funziona. Nessuna delle espressioni regolari dell'URL che ho provato, se aggiunta come annotazione di dati MVC, funziona. –

+0

Questo sembra funzionare per me [RegularExpression ("^ [(http (s)?): \\/\\/(www \\.)? A-zA-Z0-9 @:% ._ \\ + ~ # =] {2256} \\ [az] {2,6} \\ b. ([- a-zA-Z0-9 @:.?% _ \\ + ~ # & // =] *) $ ")] – Lsakurifaisu

Problemi correlati