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

我偶尔会让ActionLink拒绝在我的应用程序中使用占位符创建正确的URL,但是当我在Route属性上指定Name时,它会生成URL属性.

我最近遇到的是这个:

[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参数与函数期望的匹配.添加了Route的Name参数以查看RouteLink是否有效,ActionLink在之前或之后未按预期工作.

有什么东西完全被斩首我会失踪吗?

最佳答案 从第一个视图片段开始:

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

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

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
)

如果您没有使用它,可以为htmlAttributes参数传递null,使您的代码片段成为:

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

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

点赞