Маршрутизация к контроллеру с обязательным непустым параметром Guid - PullRequest
8 голосов
/ 17 сентября 2011

Я хотел бы отобразить http://localhost/Guid-goes-here на ResellerController и запустить Index действие этого контроллера, только когда Guid-goes-here равно , а не пустой Guid.Моя таблица маршрутизации выглядит так:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Reseller",
        "{id}",
        new { controller = "Reseller", action = "Index", id = Guid.Empty }  
        // We can mark parameters as UrlParameter.Optional, but how to make it required?
    );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );

}

Действие на ResellerController выглядит следующим образом:

public ActionResult Index(Guid id)
{
    // do some stuff with non-empty guid here
}

После запуска приложения перейдите к http://localhostнаправляет меня к ResellerController с пустым Guid в качестве аргумента для параметра id действия Index.

Ответы [ 2 ]

15 голосов
/ 17 сентября 2011
public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Reseller",
        "{id}",
        new { controller = "Reseller", action = "Index", id = UrlParameter.Optional },
        new { id = @"^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$" }
    );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );
}

или если вы хотите более надежное ограничение, чем какое-то загадочное регулярное выражение:

public class GuidConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        var value = values[parameterName] as string;
        Guid guid;
        if (!string.IsNullOrEmpty(value) && Guid.TryParse(value, out guid))
        {
            return true;
        }
        return false;
    }
}

и затем:

routes.MapRoute(
    "Reseller",
    "{id}",
    new { controller = "Reseller", action = "Index", id = UrlParameter.Optional },
    new { id = new GuidConstraint() }
);
1 голос
/ 17 сентября 2011

Необходимо включить ограничение в определение маршрутизации. Посмотрите на этот пост: http://blogs.microsoft.co.il/blogs/bursteg/archive/2009/01/11/asp-net-mvc-route-constraints.aspx

...