我偶尔会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
在之前或之后无法正常工作。
有什么东西完全被斩首我不知道吗?
答案 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}}
这会生成预期的锚元素,并且由于指定了控制器名称,因此在引用当前请求未通过其路由的控制器时也可以使用它。