web-dev-qa-db-fra.com

validation de l'url mvc4

J'écris cette question ici après avoir essayé de trouver une réponse pendant deux jours.

en gros, voici ce qui se passe.

J'ai une propriété dans le viewmodel comme suit

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

dans la vue, j'ai ceci

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

le problème réside maintenant dans la façon dont le texte d’entrée de ce champ est validé côté client. le champ doit avoir le préfixe de protocole à tout moment, sinon il devient invalide.

quel est le meilleur moyen de résoudre ce problème?

Merci beaucoup

21
Amila

Vous pouvez le faire en utilisant la bibliothèque DataAnnotationsExtensions . Ils ont une UrlAttribute que vous pouvez configurer pour ne valider que lorsqu'un protocole est spécifié. Cet attribut fournit également une validation côté client. Vous pouvez voir un exemple de ce comportement ici: http://dataannotationsextensions.org/Url/Create

Vous pouvez utiliser cet attribut comme suit:

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

Pour vos besoins, la première option suffit.

Le package de cette bibliothèque (avec le support ASP.NET MVC inclus) est disponible sur NuGet: Package d'installation DataAnnotationsExtensions.MVC3

Remarque: cela fonctionne également très bien avec ASP.NET MVC 4.

33
Erik Schierboom

Pas sûr de bien comprendre la question. Essayez-vous de valider des URL correctement formées? Si tel est le cas, vous pouvez implémenter un DataAnnotation RegularExpression comme suit:

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