Отразить значение маршрута в asp.net MVC-маршрутов - PullRequest
4 голосов
/ 05 апреля 2010

Я новичок в asp.net mvc, поэтому, пожалуйста, потерпите меня.

У нас есть следующая настройка словаря маршрутов.

routes.MapRoute(
            "Default",                                              // Route name
            "{language}/{controller}/{action}/{id}",                           // URL with parameters
            new { language = "en", controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

для любой данной страницы в нашем приложении мы должны сделать ссылку на французскую версию этой же страницы. Например, страница:

http://www.example.com/en/home

должна иметь ссылку на эту страницу, которая указывает на

http://www.example.com/fr/home

Теперь у меня есть следующий метод расширения UrlHelper

public static string FilpLanguage(this UrlHelper urlHelper)
    {
        var data = urlHelper.RequestContext.RouteData;
        if (System.Threading.Thread.CurrentThread.CurrentCulture == CultureInfo.GetCultureInfoByIetfLanguageTag("en-CA"))
            data.Values["language"] = "fr";
        else
            data.Values["language"] = "en";

        return urlHelper.RouteUrl(data.Values.Where(item => item.Value != null));
    }

Однако при вызове FilpLanguage на www.example.com/en/home будет возвращен следующий URL:

www.example.com/en/home?current=[,]

Я что-то здесь упускаю? откуда появился текущий параметр?

Заранее спасибо.

Обновление

Я обнаружил, что могу просто использовать RouteValueDictionary в текущем контексте запроса

public static MvcHtmlString GetOtherLanguageLink(this HtmlHelper html, string linkText)
    {
        var routeDictionary = html.ViewContext.RouteData.Values;

        if (null == routeDictionary["action"] || !(routeDictionary["action"] is string) ||
            null == routeDictionary["controller"] || !(routeDictionary["controller"] is string))
            throw new ArgumentException("Either action or controller is missing in routeData.Values (RouteValueDictionary)");

        if (System.Threading.Thread.CurrentThread.CurrentCulture == CultureInfo.GetCultureInfoByIetfLanguageTag("en-CA"))
            routeDictionary["language"] = "fr";
        else
            routeDictionary["language"] = "en";

        // add query strings as extra route values
        foreach (string key in html.ViewContext.RequestContext.HttpContext.Request.QueryString.AllKeys)
            if (!string.IsNullOrEmpty(key) && !routeDictionary.ContainsKey(key))
                routeDictionary.Add(key, html.ViewContext.RequestContext.HttpContext.Request.QueryString[key]);

        return html.ActionLink(linkText, routeDictionary["action"].ToString(), routeDictionary["controller"].ToString(), routeDictionary, null);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...