3

リンクを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)%>

そして、URL に fooKey と barKey を保持しながら、BarController.Details(barID) につながります。

T4MVC から始めたので、次のように変更してみました。

<% =Html.ActionLink(bar.Name, MVC.Bar.Details(bar.ID), null)%>

barKey と fooKey は Details アクション シグネチャの一部ではないため、URL には表示されなくなりました。

これらのパラメーターをアクション シグネチャに追加することなく、これを回避する方法はありますか?

4

3 に答える 3

9

同様のことが T4MVC フォーラム (このスレッド) でも出てきました。先に進んで、T4MVC でサポートを追加すると思います。

実は、これを解決する興味深い方法を考えただけです。追加の引数を渡すためにオーバーロードを追加する際の問題は、ActionResult を受け取る他のすべての T4MVC 拡張メソッドに同様のオーバーロードを追加する必要があり、面倒になる可能性があることです。

代わりに、流暢なアプローチを使用して、ほとんど労力をかけずにこれをどこでも利用できるようにすることができます。アイデアは、あなたが書くことです:

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

または、値を 1 つだけ追加する必要がある場合:

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

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;
}

これを試してみて、それがどのように機能するかを教えていただければ幸いです。

ありがとう、デビッド

于 2009-12-13T19:01:22.353 に答える
1

T4MVC.cs 内の生成されたコードを調べます。ActionLink を受け取る html ヘルパー拡張機能があります。別のルート値のセットを受け取り、それらを ActionResult.GetRouteValueDictionary() と組み合わせるオーバーロードを作成する必要があります。

    public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, ActionResult result, IDictionary<string, object> htmlAttributes) {
        return htmlHelper.RouteLink(linkText, result.GetRouteValueDictionary(), htmlAttributes);
    }
于 2009-12-11T14:51:57.393 に答える
-1

ありがとうございます!

誰かがそれを必要とする場合に備えて、これが私が使用したコードです。リファクタリングジョブを使用できますが、機能します

public static MvcHtmlString ActionLink<T>(this HtmlHelper<T> htmlHelper, string linkText, ActionResult result,
                                              object extraRouteValues, object htmlAttributes)
    {
        RouteValueDictionary completeRouteValues = result.GetRouteValueDictionary();
        RouteValueDictionary extraRouteValueDictionary = new RouteValueDictionary(extraRouteValues);
        foreach (KeyValuePair<string, object> foo in extraRouteValueDictionary)
        {
            completeRouteValues.Add(foo.Key, foo.Value);
        }

        Dictionary<string, object> htmlAttributesDictionary = htmlAttributes != null ? htmlAttributes.GetType().GetProperties().ToDictionary(p => p.Name, p => p.GetValue(htmlAttributes, null)) : null;

        return htmlHelper.RouteLink(linkText, completeRouteValues, htmlAttributesDictionary);
    }
于 2009-12-12T17:34:20.117 に答える