39 votes

Comment créer une contrainte de route de type System.Guid ?

Quelqu'un peut-il m'indiquer comment cartographier un itinéraire qui nécessite deux guides ?

ie. http://blah.com/somecontroller/someaction/ {firstGuid}/{secondGuid}

où firstGuid et secondGuid ne sont pas facultatifs et doivent être de type system.Guid ?

48voto

kazimanzurrashid Points 1400

Créez une RouteConstraint comme suit :

public class GuidConstraint : IRouteConstraint {

public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
    if (values.ContainsKey(parameterName))
    {
        string stringValue = values[parameterName] as string;

        if (!string.IsNullOrEmpty(stringValue))
        {
            Guid guidValue;

            return Guid.TryParse(stringValue, out guidValue) && (guidValue != Guid.Empty);
        }
    }

    return false;
}}

Ensuite, en ajoutant la route :

routes.MapRoute("doubleGuid", "{controller}/{action}/{guid1}/{guid2}", new { controller = "YourController", action = "YourAction" }, new { guid1 = new GuidConstraint(), guid2 = new GuidConstraint() });

21voto

Kryszal Points 61

10voto

danludwig Points 19213

Si vous utilisez le code de kazimanzurrashid, assurez-vous d'inclure le commentaire de Nikos D. J'ai fini par obtenir ceci :

public class NonEmptyGuidRouteConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, 
        string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        if (values.ContainsKey(parameterName))
        {
            var guid = values[parameterName] as Guid?;
            if (!guid.HasValue)
            {
                var stringValue = values[parameterName] as string;
                if (!string.IsNullOrWhiteSpace(stringValue))
                {
                    Guid parsedGuid;
                    Guid.TryParse(stringValue, out parsedGuid);
                    guid = parsedGuid;
                }
            }
            return (guid.HasValue && guid.Value != Guid.Empty);
        }
        return false;
    }
}

6voto

Josh Points 1001

Méfiez-vous définitivement du code donné par @kazimanzurrashid. C'était un bon début, mais il y a certainement un bug ou deux. J'ai passé un vrai Guid dans les valeurs de la route (au lieu d'une chaîne de Guid), et je n'ai rien pu faire correspondre à ma route. Il m'a fallu une éternité pour réaliser que le GuidConstraint était contraignant contre un réel Guide si cela a un sens :)

Voici ce que j'ai obtenu, qui accepte n'importe quel type de données (pas seulement les chaînes de caractères), est un peu plus rapide (je pense) et contient moins d'informations. si le bloc nidification.

public class GuidConstraint : IRouteConstraint
{

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        object value;
        if (!values.TryGetValue(parameterName, out value)) return false;
        if (value is Guid) return true;

        var stringValue = Convert.ToString(value);
        if (string.IsNullOrWhiteSpace(stringValue)) return false;

        Guid guidValue;
        if (!Guid.TryParse(stringValue, out guidValue)) return false;
        if (guidValue == Guid.Empty) return false;

        return true;
    }
}

2voto

dove Points 12456

+1 @kazimanzurrashid. Cela semble parfait.

Je vais donner une alternative pour ceux qui n'ont pas le C#4.0, dont Guid.TryParse fait partie. Il existe une autre alternative avec Regex mais ça ne vaut probablement pas la peine de s'en préoccuper.

 public class GuidConstraint : IRouteConstraint
    {

        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            if (values.ContainsKey(parameterName))
            {
                string stringValue = values[parameterName] as string;

                if (!string.IsNullOrEmpty(stringValue))
                {
                    //replace with Guid.TryParse when available.
                    try
                    {
                        Guid guid = new Guid(stringValue);
                        return true;
                    }
                    catch
                    {
                        return false;
                    }

                }
            }

            return false;
        }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X