Como posso adicionar um fragmento de hash ao ActionResult do dicionário de rotas T4MVC?

Tenho um método de extensão que retorna um ActionResult (simplificado para fins de demonstração):

public static ActionResult GetTestActionResult(this HtmlHelper htmlHelper, int productId)
{
    return MVC.Products.Details(productId);
}

Estou usando isso em um Html.ActionLink:

@Html.ActionLink("Product Details", Html.GetTestActionResult(Model.ProductId), new { @class = "button blue" });

Estou usando um plug-in jQuery personalizado para guias, que usa esses fragmentos de hash para navegação. Quero adicionar a guia que quero abrir, marcando o fragmento de hash no final da URL.

Html.ActionLink tem umsobrecarg para o fragmento, a saber:

public static MvcHtmlString ActionLink(
    this HtmlHelper htmlHelper,
    string linkText,
    string actionName,
    string controllerName,
    string protocol,
    string hostName,
    string fragment,
    Object routeValues,
    Object htmlAttributes
)

No entanto, isso é cheio de seqüências mágicas desagradáveis, que o T4MVC foi projetado para remover. Existe alguma maneira de adicionar o fragmento ao dicionário de rotas no meu método de extensão estática (GetTestActionResult)?

Algo como

return MVC.Products.Details(productId).AddRouteValue(String.Empty, "#tab-similar-products");

Estou ciente de que existem duas perguntas e respostas semelhantes no SO, mas elas não me fornecem exatamente o que estou procurando. Eu preciso envolver o fragmento no ActionResult ANTES de passá-lo de volta para a exibição:

Incluindo valores de hash nas rotas de URL do ASP.NET MVCCrie um ActionLink T4MVC com fragmento de URLATUALIZAR

Usando a correção de David Ebbo abaixo, fiz as seguintes alterações. Um pouco hacky, mas funciona:

Primeiramente, alterei minha função interna que retorna um ActionResult para que também adicionasse o fragmento como um valor de rota (não é o ideal, mas funciona):

return MVC.Products.Details(productId).AddRouteValue("tab", "#tab-similar-products");

Em seguida, na visualização, ele copia esse valor de fragmento do dicionário de rota e remove esse valor de integridad

// get my ActionResult with the tab fragment tagged on as a route value
var actionResult = Html.GetTestActionResult(item.Key, Model.ClaimId);

// get the tab fragment value
var tabRoute = actionResult.GetRouteValueDictionary().FirstOrDefault(r => r.Key == "tab").Value ?? "none";

// remove the route value, otherwise it will get tagged to the querystring
actionResult.GetRouteValueDictionary().Remove("tab");

// display
@Html.ActionLink("Product Details", Html.GetTestActionResult(Model.ProductId), new { @class = "button blue" }, fragment: tabRoute.ToString());

Tenho certeza de que há uma maneira mais bonita de retornar o fragmento com o ActionResult, mas, no momento, isso funciona. Obrigado David.

questionAnswers(1)

yourAnswerToTheQuestion