如何从Html Helper ActionLink获取标准的期望Controller-Action-ID而不是查询字符串

时间:2017-07-02 18:03:13

标签: c# asp.net-mvc

我怀疑有人会称之为重复......我已经查看了我看过的示例,并尝试实施建议的更改,但我仍然遇到此问题。在我的索引视图中,我有一个ActionLink HTML Helper来重定向到Edit。当我将鼠标悬停在它上面时,它会将URL目标显示为:

http://localhost:58028/Instruments/Edit?InstrumentId=1

而不是所需的

http://localhost:58028/Instruments/Edit/1

我已经建立了一个"用于比较"脚手架的情况,在我看来,我正在做同样的事情,但它产生了正确的URL。当我在控制器的Edit例程中调试并停止时,它向我显示它正在使用正确(且唯一)的映射。

有人可以告诉我我错过了什么:

这是我的观看代码:

 <td>@Html.ActionLink(item.Description, "Edit", new { InstrumentId = item.InstrumentId })</td>

这是我的控制器代码:

 public ActionResult Edit(int? InstrumentId)

这是我的路线:

public static void RegisterRoutes(RouteCollection routes)
{
    //routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

2 个答案:

答案 0 :(得分:1)

您的默认路由需要一个名为id的参数,因此要使用默认路由,请将链接更改为

@Html.ActionLink(item.Description, "Edit", new { id = item.InstrumentId })

以及

的方法
public ActionResult Edit(int? id)

或为您的方法创建一个特定路由,其中​​包含名为InstrumentId的参数的占位符,并将其放在默认路由之前

routes.MapRoute(
    name: "InstrumentEdit",
    url: "Instruments/Edit/InstrumentId",
    defaults: new { controller = "Instruments", action = "Edit" }
);
routes.MapRoute(
    name: "Default",
    ....

两个选项都会生成../Instruments/Edit/1

答案 1 :(得分:0)

尝试将Html Helper更改为此

@Html.ActionLink(item.Description, "Edit", new { id = item.InstrumentId })