我试图像这样生成hreflang标签:
<link hreflang="en-DE" rel="alternate" href="/en-DE" />
我目前正在将我的字典放在一起,如下所示,我想我可以使用第二个foreach循环来生成带有键值对的标签:
public static IHtmlString HrefLangLinks(this PageData currentPage)
{
var hrefLangTags = string.Empty;
var availablePageLanguages = currentPage.ExistingLanguages.Select(culture => culture.Name).ToArray();
Dictionary<string, string> langs = new Dictionary<string, string>();
var contentLoader = ServiceLocator.Current.GetInstance<IContentLoader>();
var urlResolver = ServiceLocator.Current.GetInstance<UrlResolver>();
foreach (string cultureName in availablePageLanguages)
{
var culturePage = contentLoader.Get<PageData>(currentPage.ContentGuid, new LanguageSelector(cultureName));
var culturePath = urlResolver.GetVirtualPath(culturePage.ContentLink, culturePage.Language.Name);
langs.Add(cultureName, culturePath.GetUrl());
foreach (KeyValuePair<string, string> entry in langs)
{
hrefLangTags += ("<link hreflang=\"{0}\" rel=\"alternate\" href=\"{1}\" >", langs.Keys, langs.Values);
}
}
return new HtmlString(hrefLangTags);
}
是否有一种简单而优雅的方式来遍历字典并创建我的标签?
你为什么甚至用词典?您可以遍历“availablePageLanguages”并将所需数据附加到“hrefLangTags”。像这样:
public static IHtmlString HrefLangLinks(this PageData currentPage)
{
var hrefLangTags = string.Empty;
var availablePageLanguages = currentPage.ExistingLanguages.Select(culture => culture.Name).ToArray();
var contentLoader = ServiceLocator.Current.GetInstance<IContentLoader>();
var urlResolver = ServiceLocator.Current.GetInstance<UrlResolver>();
foreach (string cultureName in availablePageLanguages)
{
var culturePage = contentLoader.Get<PageData>(currentPage.ContentGuid, new LanguageSelector(cultureName));
var culturePath = urlResolver.GetVirtualPath(culturePage.ContentLink, culturePage.Language.Name);
hrefLangTags += String.Format("<link hreflang=\"{0}\" rel=\"alternate\" href=\"{1}\" >", culturName, culturePath.GetUrl());
}
return new HtmlString(hrefLangTags);
}
只是为了好玩,你可以在linq
做,它更简洁一点
public static IHtmlString HrefLangLinks(this PageData currentPage)
{
var contentLoader = ServiceLocator.Current.GetInstance<IContentLoader>();
var urlResolver = ServiceLocator.Current.GetInstance<UrlResolver>();
var links = currentPage.ExistingLanguages.Select(culture =>
{
var culturePage = contentLoader.Get<PageData>(currentPage.ContentGuid, new LanguageSelector(culture.Name));
var culturePath = urlResolver.GetVirtualPath(culturePage.ContentLink, culturePage.Language.Name);
return $"<link hreflang=\"{culture.Name}\" rel=\"alternate\" href=\"{culturePath.GetUrl()}\" >";
});
return new HtmlString(string.Join("",links));
}
免责声明:完全未经测试或验证......我对您使用此代码造成伤害或受伤的人不负责任
你的方法没有使用SOLID (Single responsibility)的第一个原则。您想要根据数据输入返回链接。但是,您正在使用负责将其转换为IHtmlStrings列表的相同方法生成所需数据。
下面的代码可能不紧凑,但它更容易阅读,因为嵌套的foreach循环被删除。您可以通过链接它们来调用下面的方法:CreateLanguageLinksList(CreateWorkingLanguageDictionary(currentPage))
或者这样做
var languageDictionary = CreateWorkingLanguageDictionary(currentPage);
var listOfIHtmlStrings = CreateLanguageLinksList(languageDictionary);
上面的代码更容易阅读,因此认知负荷不那么紧张。
public Dictionary<string, string> CreateWorkingLanguageDictionary(this PageData currentPage)
{
var languageDictionary = new Dictionary<string, string>();
var contentLoader = ServiceLocator.Current.GetInstance<IContentLoader>();
var urlResolver = ServiceLocator.Current.GetInstance<UrlResolver>();
foreach (string cultureName in availablePageLanguages)
{
var culturePage = contentLoader.Get<PageData>(currentPage.ContentGuid, new LanguageSelector(cultureName));
var culturePath = urlResolver.GetVirtualPath(culturePage.ContentLink, culturePage.Language.Name);
languageDictionary.Add(cultureName, culturePath.GetUrl());
}
return languageDictionary;
}
public IList<IHtmlString> CreateLanguageLinksList(Dictionary<string, string> langs)
{
var htmlStringList = new List<IHtmlString>();
foreach (KeyValuePair<string, string> entry in langs)
{
htmlStringList.add(new HtmlString("<link hreflang=\"{0}\" rel=\"alternate\" href=\"{1}\" >", langs.Keys, langs.Values));
}
return htmlStringList;
}