T4MVC SEO的链接

Ome*_*ger 3 asp.net-mvc seo t4mvc

我正在尝试将我们的链接切换到T4MVC,并且我的参数不是动作签名的一个小问题.我们有一条类似这样的路线:

http://www.mydomain.com/{fooKey}/{barKey}/{barID}

==>导致BarController.Details(barID).

fooKey和barKey仅添加到链接以用于SEO目的.(因为bar是foo的子实体,我们想在URL中表示该层次结构)

到目前为止,我们会使用

<% =Html.ActionLink(bar.Name, "Details", "Bar", new {barID = bar.ID, fooKey = bar.Foo.Key, barKey = bar.Key}, null)%>
Run Code Online (Sandbox Code Playgroud)

这将导致我们使用BarController.Details(barID),同时在URL中保留fooKey和barKey.

现在我们开始使用T4MVC,我们尝试将其更改为

<% =Html.ActionLink(bar.Name, MVC.Bar.Details(bar.ID), null)%>
Run Code Online (Sandbox Code Playgroud)

由于barKey和fooKey不是Details操作签名的一部分,因此URL中不再显示它们.

有没有办法绕过这个而不必将这些参数添加到动作签名中?

Dav*_*bbo 9

类似的事情也出现在T4MVC论坛上(这个主题).我想我会继续在T4MVC中添加对它的支持.

实际上,我只想到了解决这个问题的有趣方法.添加重载以传递额外参数的问题在于,您需要向采用ActionResult的所有其他T4MVC扩展方法添加类似的重载,这可能会变得混乱.

相反,我们可以使用流畅的方法,只需很少的努力就可以在任何地方使用它.这个想法是你会写:

<%= Html.ActionLink(
    bar.Name,
    MVC.Bar.Details(bar.ID)
        .AddRouteValues(new {fooKey = bar.Foo.Key, barKey = bar.Key}))%>
Run Code Online (Sandbox Code Playgroud)

或者,如果您只需要添加一个值:

<%= Html.ActionLink(
    bar.Name,
    MVC.Bar.Details(bar.ID)
        .AddRouteValue("fooKey", bar.Foo.Key))%>
Run Code Online (Sandbox Code Playgroud)

以下是AddRouteValues的实现方式:

public static ActionResult AddRouteValues(this ActionResult result, object routeValues) {
    return result.AddRouteValues(new RouteValueDictionary(routeValues));
}

public static ActionResult AddRouteValues(this ActionResult result, RouteValueDictionary routeValues) {
    RouteValueDictionary currentRouteValues = result.GetRouteValueDictionary();

    // Add all the extra values
    foreach (var pair in routeValues) {
        currentRouteValues.Add(pair.Key, pair.Value);
    }

    return result;
}

public static ActionResult AddRouteValue(this ActionResult result, string name, object value) {
    RouteValueDictionary routeValues = result.GetRouteValueDictionary();
    routeValues.Add(name, value);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

如果你能尝试一下这将是很好的,让我知道这对你有什么用.

谢谢,大卫