我可以使用Guid代替{controller} \ {action} \ {id} {controller} \ {id}

时间:2016-01-20 18:57:41

标签: asp.net-mvc

我希望设置简单的路由,以便{controller} / {id}默认为{controller} / details / {id}。我已在此帖中设置了它:ASP.NET MVC 4 Routes - 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 }
        );
    }
}

我可以使用Guid ID执行此操作吗?

3 个答案:

答案 0 :(得分:4)

您当前路由定义的问题是,它将适用于您的特定请求,但会破坏现有的默认路由。当您尝试访问Home/About时,它会将您发送到Home的详细信息操作!

要解决此问题,您可以做的是传递一个路由约束,您可以在其中传递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 }
    );
}

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

public class ProjectController : Controller
{       
    public ActionResult Details(Guid id)
    {          
        return View();
    }
}

对于请求yourSite/project/someValidGuid,现在它会将请求发送到Details

上的ProjectController操作

答案 1 :(得分:1)

是。它应该没有问题。通过本地测试验证。

本地主机/提交/索引/ c98b3df8-de39-4735-a82c-07de43e72233

public class SubmissionController : Controller
{
    public ActionResult Index(Guid id)
    {

    }
}

答案 2 :(得分:1)

您的路线设置方式之一就是隐藏任何其他操作方法。为确保不会发生这种情况,您可以在路线中限定id的类型:

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

否则,它将查看该{id}参数的任何数据类型。因此,字符串(如不同的操作)将被发送到Details操作方法。