ASP.NET MVC 5 生成了正确的 url 但执行了错误的 Action

ASP.NET MVC 5 generates right url but executes wrong Action

我在同一控制器中为 2 个不同的操作创建了自定义路由:

routes.MapRoute(
    name: "editEquivPack",
    url: "equivpacks/{id}/{ecommerceid}",
    defaults: new { controller = "EquivPacks", action = "Edit" }
);
routes.MapRoute(
    name: "addEquivPack",
    url: "equivpacks/add/{ecommerceid}",
    defaults: new { controller = "EquivPacks", action = "Add" }
);

URL.RouteURL("addEquivPack", ecommerceid = Model.EcommerceID) 

它生成正确的 URL:

http://localhost:53365/EquivPacks/Add/1

但是当我尝试导航到那里时,它向我发送了一条错误消息:

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Edit(Int32, Int32)' in 'XXXXXXX.Controllers.EquivPacksController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.

它似乎执行 Edit 操作而不是 Add 操作,这是在路由映射中配置的操作。

我该如何解决?

路由定义的顺序很重要,第一场比赛获胜。您的第一个路线定义 (editEquivPack) 表示 匹配包含 3 个段的 url,其中第一个段是 "equivpacks".

您的 ../EquivPacks/Add/1 的 url 匹配,因此它会调用 Edit() 方法并将值 "Add" 传递给您的 int id 参数该方法(不能绑定到 int,因此出现错误)。

您需要更改路线的顺序,使 addEquivPack 路线在 editEquivPack 路线之前。