Я новичок в 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);
}