我正在开发一个asp .net项目。我需要全球化它,所以我在developpez.com(This one)上关注了一个教程(我是一个初级开发者)。我的教程有问题,但经过一些搜索我解决了。目前,我有2个链接:
我想做的是拥有标志而不是文字。所以,我想在'<中添加一个类。 a>'元素并放置背景图像。但是当我添加类时,Html.Helper生成的链接变得很奇怪。添加了一些参数,我不明白为什么。
编辑:当我添加课程时,我忘了写链接不会改变语言。 在将类添加到链接之前的URL
<a href="/en">English</a>
<a href="/">[Français]</a>
将类添加到链接后的网址
<a href="/?Count=6&Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D">English</a>
<a class="drapeauFrance" href="/?Count=6&Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D">[Français]</a>
我如何包含指向部分视图的链接
@using MIFA.Helpers
@Html.LanguageSelectorLink("en", "[English]", "English", null)
@Html.LanguageSelectorLink("fr", "[Français]", "Français", new { @class = "drapeauFrance" })
LangageSelectorLink的工作原理
public static MvcHtmlString LanguageSelectorLink(this HtmlHelper helper, string cultureName, string selectedText, string unselectedText, object htmlAttributes, string languageRouteName = "lang", bool strictSelected = false)
{
var language = helper.LanguageUrl(cultureName, languageRouteName, strictSelected);
var link = helper.RouteLink(language.IsSelected ? selectedText : unselectedText, "LocalizedDefault", language.RouteValues, htmlAttributes);
return link;
}
LangageUrl如何运作
public static Language LanguageUrl(this HtmlHelper helper, string cultureName, string languageRouteName = "lang", bool strictSelected = false)
{
cultureName = cultureName.ToLower();
var routeValues = new RouteValueDictionary(helper.ViewContext.RouteData.Values);
var queryString = helper.ViewContext.HttpContext.Request.QueryString;
foreach (string key in queryString)
{
if (queryString[key] != null && !string.IsNullOrWhiteSpace(key))
{
if (routeValues.ContainsKey(key))
{
routeValues[key] = queryString[key];
}
else
{
routeValues.Add(key, queryString[key]);
}
}
}
var actionName = routeValues["action"].ToString();
var controllerName = routeValues["controller"].ToString();
routeValues[languageRouteName] = cultureName;
var urlHelper = new UrlHelper(helper.ViewContext.RequestContext, helper.RouteCollection);
var url = urlHelper.RouteUrl("LocalizedDefault", routeValues);
var current_lang_name = Thread.CurrentThread.CurrentUICulture.Name.ToLower();
var isSelected = strictSelected ? current_lang_name == cultureName : current_lang_name.StartsWith(cultureName);
return new Language()
{
Url = url,
ActionName = actionName,
ControllerName = controllerName,
RouteValues = routeValues,
IsSelected = isSelected
};
}
我正在请求您的帮助,以便了解在添加html属性时URL的更改原因。
我试图理解函数'LanguageUrl',因为在我看来问题就在这里,但我的知识太弱而无法理解或理解htmlAttributes对URL的影响。
如果我犯了一些英语错误,请告诉我我会编辑我的问题。
提前感谢您的回答。
答案 0 :(得分:1)
我认为你遇到了错误的超载,试试:
var link = helper.RouteLink(language.IsSelected ? selectedText : unselectedText, language.RouteValues, htmlAttributes);
答案 1 :(得分:1)
这有点难以解释,但让我试试。方法RouteLink
没有接受类型RouteValueDictionary
作为类型object
的第三个和html属性的覆盖。相反,会自动假设another override of the Method,其中第三个参数的类型为object
:
RouteLink(this HtmlHelper htmlHelper, string linkText, string routeName, Object routeValues, Object htmlAttributes)
现在效果是RouteValueDictionary
被用作匿名对象,通过反映它的属性。这是你不想要的。
一种可能的解决方案是将htmlAttributes
转换为参数,以便使用a different Method override:
RouteLink(this HtmlHelper htmlHelper, string linkText, string routeName, RouteValueDictionary routeValues, IDictionary<string, Object> htmlAttributes)
要实现这一点,您只需将匿名对象转换为IDictionary<string, Object>
即可通过调用来完成:
HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
您的新LanguageSelectorLink
方法:
public static MvcHtmlString LanguageSelectorLink(this HtmlHelper helper, string cultureName, string selectedText, string unselectedText, object htmlAttributes, string languageRouteName = "lang", bool strictSelected = false)
{
var language = helper.LanguageUrl(cultureName, languageRouteName, strictSelected);
var attributeDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
var link = helper.RouteLink(language.IsSelected ? selectedText : unselectedText, "LocalizedDefault", language.RouteValues, attributeDictionary);
return link;
}
瞧!