如何创建System.Guid类型的路由约束?

时间:2010-03-11 01:44:03

标签: asp.net-mvc asp.net-mvc-routing

有人能指出我如何绘制需要两个guid的路线的正确方向吗?

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

其中firstGuid和secondGuid都不是可选的,必须是system.Guid?

类型

6 个答案:

答案 0 :(得分:48)

创建如下所示的RouteConstraint:

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

添加路线时的下一步:

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

答案 1 :(得分:18)

答案 2 :(得分:10)

如果您使用kazimanzurrashid的代码,请务必提供Nikos D的评论。我最终得到了这个:

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

答案 3 :(得分:6)

绝对要小心@kazimanzurrashid给出的代码。这是一个好的开始,但它肯定有一个bug或者也是。我正在将一个真正的Guid传递给路线值(而不是一个Guid的字符串),我无法得到任何与我的路线匹配的东西。我花了很长时间才意识到 GuidConstraint 正在限制真正的 Guid ,如果这有任何意义的话。 :)

这是我最终得到的,它接受任何数据类型(不仅仅是字符串),更快(我认为),并且如果阻止嵌套,则包含更少的

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

答案 4 :(得分:2)

+1 @kazimanzurrashid。似乎是现场。

我会为那些没有C#4.0的人提供替代方案,其中Guid.TryParse是其中的一部分。除了probably not worth the bother.

之外,还有另一种替代方法
 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;
        }
    }

答案 5 :(得分:0)

我发现在使用像@ Html.RouteLink(...)这样的东西时,假设类型是Guid导致问题,并且在路由测试中,URL作为字符串提供。以下代码适合这些情况。使用上面的代码示例导致我的视​​图和/或测试中出现问题,以下情况正常。

 public class GuidConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        var value = values[parameterName];
        if (value == null) return false;
        var stringValue = value.ToString();

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