C# 路由到仅从URL获取一个ID的操作

C# 路由到仅从URL获取一个ID的操作,c#,asp.net,asp.net-mvc,asp.net-mvc-routing,C#,Asp.net,Asp.net Mvc,Asp.net Mvc Routing,我正在尝试为我的mvc学习项目定制路由器。 我希望保留指向{controller}/{action}/{id}的标准路由,以防出现类似URL的情况 domain.com/user/details/72 但是如果我得到一个像这样的url domain.com/2 我想路由到一个指定的控制器操作,该操作将数字作为id。因此我不希望URL指定控制器和操作,因为我希望URL非常短,并且控制器和操作应该始终相同 我有点成功了,但我得到了非常奇怪的不可预测的结果,所以我想问我是否做了一些非常奇怪的事情。以下

我正在尝试为我的mvc学习项目定制路由器。 我希望保留指向{controller}/{action}/{id}的标准路由,以防出现类似URL的情况 domain.com/user/details/72

但是如果我得到一个像这样的url domain.com/2 我想路由到一个指定的控制器操作,该操作将数字作为id。因此我不希望URL指定控制器和操作,因为我希望URL非常短,并且控制器和操作应该始终相同

我有点成功了,但我得到了非常奇怪的不可预测的结果,所以我想问我是否做了一些非常奇怪的事情。以下是我的路线:

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

        routes.MapRoute(
         name: "DisplayKombak",
         url: "{kombakId}",
         defaults: new { controller = "Kombak", action = "DisplayKombak", id = UrlParameter.Optional }
     );

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

试着这样做:

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

        routes.MapRoute(
            name: "DisplayKombak",
            url: "{kombakId}",
            defaults: new {controller = "Kombak", action = "DisplayKombak"}
            );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional}
            );
    }
}
和KombakController.cs:

using System.Web.Mvc;

namespace WebApplication1.Controllers
{
    public class KombakController : Controller
    {
        public ActionResult DisplayKombak(string kombakId)
        {
            return View();
        }
    }
}

可以通过添加管线约束强制执行此行为

routes.MapRoute(
  name: "DisplayKombak",
  url: "{kombakId}",
  defaults: new { controller = "Kombak", action = "DisplayKombak", id = UrlParameter.Optional },
  new {kombakId = @"\d+" }
);

routes.MapRoute(
  name: "Default",
  url: "{controller}/{action}/{id}",
  defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
  new {controller = @"\D+" }
);

第一条路由上的约束将阻止路由匹配,除非第一条路由段是整数,否则第二条路由上的约束将阻止路由匹配,如果第一条路由段不是一串字母。

您得到了什么奇怪的不可预测的结果?感谢您的回答!我的路线配置和你的有什么不同?我只能看到您的没有URLParameter。在第一个routemapping上是可选的。是吗?这改变了一切!谢谢。请注意关于路线最重要的两点。1.图案2.秩序。即使它没有解决我的问题,这也是一个很大的帮助,我学到了一些重要的东西。谢谢