这可能是愚蠢的,但我似乎无法弄明白。我正在使用Html.ActionLink
在主页和子页之间创建链接:Employees -> Employee
。
我只是注意到它渲染的URL并没有“塑造”为它应该匹配的路线。例如,当它应该是/Employee?EmployeeId=?
时,生成的URL为/Employees/{EmployeeId}
。
我错过了应该让它返回那种网址的东西吗?直到两周前,当我切换到Html.ActionLink
并且我可以发誓它工作正常时,我手写了所有的链接,但现在我在我的应用程序上看到这种模式,我不喜欢它..
Url.Action
和Html.RouteLink
也会创建相同的网址。
帮助将不胜感激。
@Darin的更新
以下是路线的注册方式:
Routes.MapRoute("QbNn7GFjJZBzYED7", Settings.EmployeeRoute, new {
action = "Employee"
}, new {
controller = new ControllerConstraint(Settings.AdministrationController),
group = new GroupConstraint(Settings.CorporateGroup),
EmployeeId = @"\d+"
});
Settings.EmployeeRoute = "{controller}/{group}/Employees/{EmployeeId}";
Settings.AdministrationController = "Administration";
Settings.CorporateGroup = "Corporate";
在你问为什么路由名称为QbNn7GFjJZBzYED7
之前,这是因为我厌倦了提供路由名称,因为我从不按名称引用路由,所以我开始生成随机字符串来填写虚空。
更新2
两个约束基本相同,名称不同。因此,我把它合并为一个,这就是它的样子:
internal class NameConstraint : IRouteConstraint {
private readonly string[] Names = new string[0];
public NameConstraint(
string Name) {
this.Names = new string[1] {
Name.ToLower()
};
}
public NameConstraint(
string[] Names) {
this.Names = Names.Select(
n =>
(n.ToLower())).ToArray();
}
public bool Match(
HttpContextBase HttpContextBase,
Route Route,
string Paramater,
RouteValueDictionary RouteValueDictionary,
RouteDirection RouteDirection) {
string Param = ((string)RouteValueDictionary[Paramater]).ToLower();
return this.Names.Contains(Param);
}
}
现在,在此更新与上一个更新之间,路由已自行修复。发生的唯一变化是ControllerConstraint
和GroupConstraint
并将它们合并到NameConstraint
并进行后续重建。
我不知道怎么决定修复自己,但确实如此。我不认为这是约束的合并,我怀疑这是重建。
现在这两个都产生了正确的路线:
Html.ActionLink(Employee.Name, "Employee", new { EmployeeId = Employee.EmployeeId })
Html.ActionLink(Employee.Name, "Employee", "Administration", new { group = "Corporate", EmployeeId = Employee.EmployeeId }, null)
最后我不确定实际的修复是什么......
答案 0 :(得分:1)
如果您的路线如下:{controller}/{group}/Employees/{EmployeeId}
routes.MapRoute(
"CustomRoute",
"{controller}/{group}/Employees/{EmployeeId}",
new {
controller = "Foo",
action = "Bar",
EmployeeId = UrlParameter.Optional
}
);
要生成与此路线匹配的操作链接,您需要:
<%= Html.ActionLink(
"some text", // link text
"Bar", // action
"Foo", // controller
new { group = "123", EmployeeId = "456" }, // route values
null // html attributes
) %>
注意事项:
{action}
占位符,这意味着您需要将操作指定为路线中的默认值。 group
参数。它不能是可选的,因为它不在路径的末尾