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

时间:2018-02-06 11:50:16

标签: asp.net-mvc-4 asp.net-mvc-routing

查看我使用localhost:55831/Customers/Edit/1/ALFKI

生成的网址@Html.RouteLink
@Html.RouteLink("Edit", "PageWithId",
new
{
    controller = "Customers",
    action = "Edit",
    id = item.CustomerID,
    page = ViewBag.CurrentPage
})

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

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

请一些帮助,因为当我点击ob此链接localhost:55831 / Customers / Edit / 1 / ALFKI然后客户ID ALFKI 没有传递给编辑操作。我调试编辑操作代码,发现id始终为null。我尝试了很少的路由进行编辑操作,但仍然没有运气。

1 个答案:

答案 0 :(得分:1)

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

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

目前,您的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个额外细分的网址都会与CustomerEditWithId路由匹配,第3个细分将绑定到名为page的参数,第4个细分将绑定到名为id的参数。因此,CustomersController中的方法应为

public ActionResult Edit(int page, string id)