Asp.net mvc 4 具有Id和索引操作的MVC4路由

Asp.net mvc 4 具有Id和索引操作的MVC4路由,asp.net-mvc-4,routes,Asp.net Mvc 4,Routes,我正在尝试完成以下操作,并收到#2的“未找到资源”错误。假设是因为路由配置不正确 所需URL: 1) domain.com/Customer 2) domain.com/Customer/1*不起作用 3) domain.com/Customer/All public ActionResult Index(int? id) { var viewModel = new CustomerViewModel(); if (!id.HasValue) id = 1; /

我正在尝试完成以下操作,并收到#2的“未找到资源”错误。假设是因为路由配置不正确

所需URL:

1) domain.com/Customer

2) domain.com/Customer/1*不起作用

3) domain.com/Customer/All

public ActionResult Index(int? id)
{
    var viewModel = new CustomerViewModel();

    if (!id.HasValue)
        id = 1; // ToDo: Current Logged In Customer Id

    viewModel.Load(id.Value);

    return View(viewModel);
}
public ActionResult All()
{
    return View(CustomerModel.All());
}
我的路线配置有默认的路线设置,我尝试添加一条额外的路线,但没有效果

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

我已排除设置新路由的尝试,因为它不起作用。

您的路由将正常化为domain.com/Customer/Index/1。当您拥有管线的后续部分时,不能仅因为其值将是默认值而删除早期组件。在本例中,它正在寻找一个无法找到的名为“1”的操作

编辑

如果所需的路由是domain.com/Customer/ID,则可以将此类路由添加到路由表中:

routes.MapRoute(
    name: "CustomerAll",
    url: "Customer/All",
    defaults: new { controller = "Customer", action = "All" }
);
routes.MapRoute(
    name: "CustomerByID",
    url: "Customer/{id}",
    defaults: new { controller = "Customer", action = "Index" }
);

这些更具体的路由应该位于默认路由之前。

尝试将此路由添加到默认路由之前

routes.MapRoute(
    name: "Customer",
    url: "Customers/{id}",
    defaults: new { controller = "Customer", action = "Index", id = UrlParameter.Optional }
);
请注意,url以客户而不是客户开头。


您所需的URL将是:
domain.com/Customers/1
,而不是
domain.com/Customer/1

,这很有效。我曾尝试过这样的路线,但运气不好……但诀窍是将它们不仅移动到默认客户路线之上,而且移动到所有其他路线之上。这也很有效……但我更喜欢@Rob的方法。谢谢你!