我希望设置简单的路由,以便{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执行此操作吗?
答案 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操作方法。