Как автоматически добавить определенное значение из текущего маршрута ко всем сгенерированным ссылкам? - PullRequest
4 голосов
/ 21 февраля 2011

У меня есть культура сайта в URL-адресах, подобных этому:

routes.MapRoute(
    "Default", 
    "{language}/{controller}/{action}/{id}", 
    languageDefaults, 
    languageConstraints)

И он работает как шарм с небольшой помощью пользовательского MvcHttpHandler, который устанавливает культуру пользовательского интерфейса текущего потока для каждого запроса на основе значения маршрута.Моя проблема в том, как автоматически добавить значение языкового маршрута из текущего запроса ко всем исходящим ссылкам?Например, когда запрашивается страница / EN / Foo / Bar, мне бы хотелось, чтобы

<%=Html.ActionLink(
    "example link", 
    MVC.Home.Index()) %>

автоматически генерировал тот же результат, что и этот:

<%=Html.ActionLink(
    "example link", 
    MVC.Home.Index()
        .AddRouteValue(
            "language", 
            this.ViewContext.RouteData.Values["language"]) %>

И, конечно, то же самое для всехдругие помощники, такие как BeginForm () и т. д. В моей текущей кодовой базе уже> 1000 случаев, когда эти помощники используются, и требование .AddRouteValue каждый раз очень хрупко, так как некоторые разработчики забудут использовать его со 100% уверенностью.

Надеюсь, единственное решение - это не создание пользовательских Html-помощников для всего?

1 Ответ

3 голосов
/ 21 февраля 2011

Он должен сохранять все значения, определенные в маршруте и представленные в RouteData автоматически, если вы не установите его в другое значение. Попробуйте создать ссылку без T4MVC или проверьте определения маршрута. Как-то так у меня работает просто отлично:

routes.MapRoute("Default with language", "{lang}/{controller}/{action}/{id}", new
{
    controller = "Home",
    action = "Index",
    id = UrlParameter.Optional,
}, new { lang = "de|fr" });
routes.MapRoute("Default", "{controller}/{action}/{id}", new
{
    controller = "Home",
    action = "Index",
    id = UrlParameter.Optional,
    lang = "en",
});

+

protected void Application_AcquireRequestState(object sender, EventArgs e)
{
    MvcHandler handler = Context.Handler as MvcHandler;
    if (handler == null)
        return;

    string lang = (string)handler.RequestContext.RouteData.Values["lang"];

    CultureInfo culture = CultureInfo.GetCultureInfo(lang);

    Thread.CurrentThread.CurrentUICulture = culture;
    Thread.CurrentThread.CurrentCulture = culture;
}

+

<%: Html.ActionLink("About us", "Detail", "Articles", new { @type = ArticleType.About }, null) %>
...