【问题标题】:Can I do {controller}\{id} with a Guid instead of {controller}\{action}\{id}我可以用 Guid 而不是 {controller}\{action}\{id} 来做 {controller}\{id}
【发布时间】:2016-01-20 18:57:40
【问题描述】:

我希望设置简单的路由,以便 {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 ids 做到这一点吗?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

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

    要解决这个问题,您可以做的是传递一个路由约束,您可以在其中传递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,现在它将请求发送到ProjectController上的Details操作

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 默认为索引。但它不会出错,所以这是朝着正确方向迈出的一步。
    • 将“控制器”添加到底部的默认值?
    【解决方案3】:

    是的。它应该可以正常工作。通过本地测试验证。

    localhost/提交/索引/c98b3df8-de39-4735-a82c-07de43e72233

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多