ASP.Net 路由:客户 ID 未传递给操作

ASP.Net Routing: Customer ID not passing to action

查看我使用 @Html.RouteLink

生成的 url localhost:55831/Customers/Edit/1/ALFKI
@Html.RouteLink("Edit", "PageWithId",
new
{
    controller = "Customers",
    action = "Edit",
    id = item.CustomerID,
    page = ViewBag.CurrentPage
})

这是我的路由代码 PageWithId 我尝试了两个路由一个接一个但是 none 工作

    routes.MapRoute(
        name: "PageWithId",
        url: "{controller}/{action}/{page}/{id}"
    );

routes.MapRoute(
    name: "CustomerEditWithId",
    url: "Customers/Edit/{page}/{id}",
    defaults: new { controller = "Customers", action = "Edit" }
);

我所有的路由代码

routes.MapRoute(
name: "PageWithSort",
url: "{controller}/{action}/{page}/{SortColumn}/{CurrentSort}",
defaults: new { action = "Index", page = UrlParameter.Optional, SortColumn = UrlParameter.Optional, CurrentSort = UrlParameter.Optional }
);

routes.MapRoute(
name: "PageWithId",
url: "{controller}/{action}/{page}/{id}"
);


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

请有人帮忙,因为当我点击这个 link localhost:55831/Customers/Edit/1/ALFKI 然后 客户 ID ALFKI 没有传递给编辑动作。我调试编辑操作代码,发现 id 总是变得空。我尝试了一些用于编辑操作的路由,但仍然没有成功。

路线的顺序很重要。路由按顺序检查,第一个匹配的路由获胜。

因为您的第一个 (PageWithSort) 路线匹配任何具有 1 到 5 个路段的路线,然后 /Customers/Edit/1/ALFKI,其中包含 4 个路段匹配,并且不再检查其他路线。由于 ALFKI 被传递给名为 SortColumn 的第 4 个段,因此它只会绑定到 Edit() 方法中名为 SortColumn 的参数(而不是名为 id)

就目前而言,您的 PageWithIdDefault 路线毫无意义,因为它们永远不会被击中。

此外,只有路由定义中的最后一个参数可以用UrlParameter.Optional标记。

您需要创建特定的路线,并以正确的顺序定位它们。将您的路线定义更改为(请注意,我省略了 PageWithSort 路线,因为它不清楚您想要用它做什么,而且它仍然包含错误)

routes.MapRoute(
    name: "CustomerEditWithId",
    url: "Customers/Edit/{page}/{id}",
    defaults: new { controller = "Customers", action = "Edit" }
);

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

现在任何以 /Customers/Edit 开头并包含 2 个附加段的 url 将匹配 CustomerEditWithId 路由,并且第 3 个段将绑定到名为 [=25= 的参数] 并且第 4 段将绑定到名为 id 的参数。因此,您在 CustomersController 中的方法应该是

public ActionResult Edit(int page, string id)