【问题标题】:Routing to action getting only one ID from the URL仅从 URL 获取一个 ID 的路由到操作
【发布时间】:2014-06-04 17:37:44
【问题描述】:

我正在尝试为我的 mvc 学习项目制作一个自定义路由器。 我想保留指向 {controller}/{action}/{id} 的标准路由,以防类似 URL domain.com/user/details/72

但是如果我得到一个这样的网址 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 }
        );
    }
}

【问题讨论】:

  • 你得到了什么奇怪的不可预知的结果?

标签: c# asp.net asp.net-mvc asp.net-mvc-routing


【解决方案1】:

试试这样的:

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();
        }
    }
}

【讨论】:

  • 感谢您的回答!我的路由配置和你的有什么区别?我只能看到您的第一个路由映射上没有 URLParameter.Optional。是这样吗?
  • 这改变了一切!谢谢。
  • 请注意关于路线的两个最重要的事情。 1.图案。 2. 订购。
【解决方案2】:

您可以通过添加路由约束来强制执行此行为。

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+" }
);

第一个路由的约束会阻止路由匹配,除非第一个路由段是整数,第二个路由的约束会阻止路由匹配,如果第一个路由段不是字符串。

【讨论】:

  • 即使它没有解决我的问题,它也是一个很大的帮助,我学到了一些重要的东西。谢谢!
猜你喜欢
  • 2018-08-19
  • 1970-01-01
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多