MVC RouteConfig风格

时间:2017-10-02 15:51:36

标签: c# asp.net-mvc-5 routeconfig

在我的表格中,我有两个链接:

@Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
@Html.ActionLink("Events", "LocationEvents", "Events", new {locationId = item.Id}, null)

现在我的目标是当我将鼠标悬停在链接上时,我希望网址看起来像这样:

/Locations/Edit/4
/Events/LocationEvents/4

然而,我得到了这个:

/Locations/Edit?id=4
/Events/LocationEvents/4

这是我的RouteConfig.cs

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

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

我如何使这项工作?

1 个答案:

答案 0 :(得分:2)

简单地说,你不能有这样的两条路线。它们在功能上都是相同的,采用控制器,动作和某种id值。 id param名称不同的事实不足以区分路由。

首先,您需要通过硬编码其中一个参数来区分路线。例如,您可以执行以下操作:

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

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

然后,第一条路线只匹配以“活动”开头的网址。否则,将使用默认路由。当客户端请求URL时,必须正确处理路由。它在生成路线方面仍然没有帮助,因为UrlHelper没有足够的信息来确定选择哪一个。为此,您需要使用路由名称明确告诉它使用哪个:

@Html.RouteLink("Default", new { controller = "Edit", action = "edit", id = item.Id })

坦率地说,RouteConfig风格的路由是一个巨大的痛苦。除非你处理的是一个非常简单的结构,几乎可以通过默认路由处理,然后你会更好地使用属性路由,在那里你描述了每个动作应该具有的确切路由。例如:

[RoutePrefix("Events")]
public class EventsController : Controller
{
    ...

    [Route("LocationEvents", Name = "LocationEvents")]
    public ActionResult LocationEvents(int locationId)
    {
        ...
    }
}

然后,它是绝对明确的,如果您想确保获得正确的路线,您可以使用该名称(与Html.RouteLinkUrl.RouteUrl等一起使用)