我可以用Guid代替{controller} \ {action} \ {id}来执行{controller} \ {id}

M K*_* II 1 asp.net-mvc

我希望设置简单的路由,以便{controller} / {id}将默认为{controller} / details / {id}。我已经在这篇文章中进行了设置:ASP.NET MVC 4路由-controller / id vs controller / action / id

但是那篇文章暗示了工作的路线,我将需要int{id}值。我们使用Guid ID。

这是我所拥有的:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.LowercaseUrls = true;
        routes.MapMvcAttributeRoutes(); 

        routes.MapRoute
        (
            name: "Detail",
            url: "{controller}/{id}",
            defaults: new { action = "Details", id = UrlParameter.Optional }
        );

        routes.MapRoute
        (
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Submission", action = "Index", id = UrlParameter.Optional }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以使用Guid身份证吗?

Shy*_*yju 5

当前路由定义的问题是,它可以满足您的特定请求,但会破坏现有的默认路由,当您尝试访问时Home/About,它将带您到Home!的Details动作。

为了解决这个问题,您可以做的是传递一个路由约束,您可以在其中传递正则表达式Guid

这应该工作正常。

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

    routes.MapRoute
        (
            name: "Detail",
            url: "{controller}/{id}",
            defaults: new { action = "Details", id = UrlParameter.Optional   },
            constraints: new { id = "[A-Z0-9]{8}-([A-Z0-9]{4}-){3}[A-Z0-9]{12}" }
        );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}
Run Code Online (Sandbox Code Playgroud)

并将您的操作方法参数类型更改为Guid

public class ProjectController : Controller
{       
    public ActionResult Details(Guid id)
    {          
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

对于该请求yourSite/project/someValidGuid,现在将请求发送到Details行动ProjectController