将字典内容输出为有效的html标签的明智方法?

问题描述 投票:0回答:3

我试图像这样生成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);

}

是否有一种简单而优雅的方式来遍历字典并创建我的标签?

c#
3个回答
0
投票

你为什么甚至用词典?您可以遍历“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);

}

0
投票

只是为了好玩,你可以在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));
}

免责声明:完全未经测试或验证......我对您使用此代码造成伤害或受伤的人不负责任


0
投票

你的方法没有使用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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.