【问题标题】:ActionLink doesn't make correct with URL, but RouteLink does with attribute routingActionLink 不能正确处理 URL,但 RouteLink 可以处理属性路由
【发布时间】:2014-07-24 21:55:21
【问题描述】:

我偶尔会遇到 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 参数与函数期望的匹配。将Name 参数添加到Route 以查看RouteLink 是否可以工作,ActionLink 在之前或之后没有按预期工作。

我是否缺少一些完全愚蠢的东西?

【问题讨论】:

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


    【解决方案1】:

    从第一个视图sn-p开始:

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

    这个sn-p使用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 one:

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

    如果你不使用htmlAttributes参数,可以将null传给htmlAttributes,让你的sn-p变成:

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-30
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      相关资源
      最近更新 更多