我偶尔会让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
)
这会生成预期的锚元素,并且因为指定了控制器名称,所以在引用当前请求未通过其路由的控制器时也可以使用它.