Html.ActionLink呈现非路由URL

时间:2011-01-21 03:11:32

标签: asp.net-mvc

这可能是愚蠢的,但我似乎无法弄明白。我正在使用Html.ActionLink在主页和子页之间创建链接:Employees -> Employee

我只是注意到它渲染的URL并没有“塑造”为它应该匹配的路线。例如,当它应该是/Employee?EmployeeId=?时,生成的URL为/Employees/{EmployeeId}

我错过了应该让它返回那种网址的东西吗?直到两周前,当我切换到Html.ActionLink并且我可以发誓它工作正常时,我手写了所有的链接,但现在我在我的应用程序上看到这种模式,我不喜欢它..

Url.ActionHtml.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);
    }
}

现在,在此更新与上一个更新之间,路由已自行修复。发生的唯一变化是ControllerConstraintGroupConstraint并将它们合并到NameConstraint并进行后续重建。

我不知道怎么决定修复自己,但确实如此。我不认为这是约束的合并,我怀疑这是重建。

现在这两个都产生了正确的路线:

Html.ActionLink(Employee.Name, "Employee", new { EmployeeId = Employee.EmployeeId })
Html.ActionLink(Employee.Name, "Employee", "Administration", new { group = "Corporate", EmployeeId = Employee.EmployeeId }, null)

最后我不确定实际的修复是什么......

1 个答案:

答案 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参数。它不能是可选的,因为它不在路径的末尾