ActionLink不能正确使用URL,但RouteLink使用属性路由

时间:2014-07-24 21:55:22

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

我偶尔会ActionLink拒绝在我的应用中使用占位符制作正确的网址,但是当我在Name属性上指定Route时,会生成网址属性。

我最近遇到这个问题的原因是:

[RoutePrefix("RuleConfiguration")]
public class RuleConfigurationController : EntityController<RuleConfigurationModel, RuleConfiguration>
{
    //...Snip...
    [Route("{configurationId}/Edit", Name = "RuleConfigurationEdit")]
    public async Task<ActionResult> Edit(int configurationId)
    {
        return View(...);
    }
    //...Snip...
}

鉴于此设置,我希望ActionLink在使用时如下:

@Html.ActionLink(name, "Edit", "RuleConfiguration", new { configurationId = conf.Id })

给我一​​个/RuleConfiguration/1/Edit行的网址。但是,我只得/RuleConfiguration。使用RouteLink时如此:

@Html.RouteLink(conf.Name, "RuleConfigurationEdit", new { configurationId = conf.Id })

这会产生预期的URL。在同一视图中,我有ActionLink生成指向另一个操作的链接,并且该操作使用预期的操作名称生成。一个区别是这个其他动作没有任何路由参数。

我已经检查过(好几次)我正确拼写了ActionLink拼写的参数,并且URL参数与函数所期望的匹配。添加了Name的{​​{1}}参数,以查看Route是否有效,RouteLink在之前或之后无法正常工作。

有什么东西完全被斩首我不知道吗?

1 个答案:

答案 0 :(得分:2)

从第一个视图片段开始:

@Html.ActionLink(
    name,
    "Edit",
    "RuleConfiguration",
    new {
        configurationId = conf.Id
    }
)

此代码段使用this方法的ActionLink重载:

public static MvcHtmlString ActionLink(
    this HtmlHelper htmlHelper,
    String linkText,
    String actionName,
    Object routeValues,
    Object htmlAttributes
)

这导致以下HTML:

<a configurationId="1" href="">Hoge</a>

configurationId属性已添加到元素中,因为最后一个参数是htmlAttributes参数。

我发现如果当前请求已经通过RuleConfigurationController路由,只需调用以下似乎就可以正常工作(使用this重载):

@Html.ActionLink(name, "Edit", new { configurationId = 1 })

这导致以下HTML:

<a href="/RuleConfiguration/1/Edit">Fuga</a>

但是,在尝试引用其他控制器中的操作时,这似乎不起作用。


要使用您想要的参数提供的重载,请使用this一个:

public static MvcHtmlString ActionLink(
    this HtmlHelper htmlHelper,
    String linkText,
    String actionName,
    String controllerName,
    Object routeValues,
    Object htmlAttributes
)

如果您不使用null参数htmlAttributes,则可以通过@Html.ActionLink( name, "Edit", "RuleConfiguration", new { configurationId = conf.Id }, null ) ,从而使您的代码段变为:

{{1}}

这会生成预期的锚元素,并且由于指定了控制器名称,因此在引用当前请求未通过其路由的控制器时也可以使用它。