【问题标题】:Creating a tag cloud out of taglink?用 taglink 创建一个标签云?
【发布时间】:2012-09-23 17:15:42
【问题描述】:

我正在使用 ASP.NET MVC3 创建博客,我想为它创建一个 tagCloud。

现在我的问题是如何将它放入列表中(我需要吗?),计算然后以不同的尺寸打印出来?

编辑:

我现在可以通过以下方式计算每个帖子中的每个标签:

Dictionary<string, int> tagLista = new Dictionary<string, int>();

    foreach (Post post in Model)
    {
        foreach (Tag tag in post.Tags)
        {
            if (!tagLista.ContainsKey(tag.Name))
            {
                tagLista[tag.Name] = 1;
            }
            else
            {
                tagLista[tag.Name] += 1;
            }
        }
    }
    //Print out diff. sizes depending on count
    foreach (KeyValuePair<string, int> pair in tagLista)
    {

        if (pair.Value <= 2)
        {
                        <a class="minSize" href="@Href("~/Posts/Tags/" + pair.Key)">@pair.Key</a>
        }

        if (pair.Value > 2 && pair.Value <= 4)
        {
                        <a class="medSize" href="@Href("~/Posts/Tags/" + pair.Key)">@pair.Key</a>
        }
        if (pair.Value > 4 && pair.Value >= 6)
        {
                        <a class="maxSize" href="@Href("~/Posts/Tags/" + pair.Key)">@pair.Key</a> 
        }
    }

现在的问题是它只显示当前页面上所有帖子的标签,而不是数据库中的所有标签。我应该怎么做呢?在这个视图(索引)的顶部,我使用:

@using Blog.Models;
@model IEnumerable<Post>

感谢您的帮助!

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 tag-cloud


    【解决方案1】:

    我现在可以通过以下方式计算每个帖子中的每个标签:

    Dictionary<string, int> tagLista = new Dictionary<string, int>();
    
    foreach (Post post in Model)
    {
        foreach (Tag tag in post.Tags)
        {
            if (!tagLista.ContainsKey(tag.Name))
            {
                tagLista[tag.Name] = 1;
            }
            else
            {
                tagLista[tag.Name] += 1;
            }
        }
    }
    //Print out diff. sizes depending on count
    foreach (KeyValuePair<string, int> pair in tagLista)
    {
    
        if (pair.Value <= 2)
        {
                        <a class="minSize" href="@Href("~/Posts/Tags/" + pair.Key)">@pair.Key</a>
        }
    
        if (pair.Value > 2 && pair.Value <= 4)
        {
                        <a class="medSize" href="@Href("~/Posts/Tags/" + pair.Key)">@pair.Key</a>
        }
        if (pair.Value > 4 && pair.Value >= 6)
        {
                        <a class="maxSize" href="@Href("~/Posts/Tags/" + pair.Key)">@pair.Key</a> 
        }
    }
    

    现在的问题是它只显示当前页面上所有帖子的标签,而不是数据库中的所有标签。我应该怎么做呢?在这个视图(索引)的顶部,我使用:

    @using Blog.Models;
    @model IEnumerable<Post>
    

    感谢您的帮助!

    【讨论】:

      【解决方案2】:

      我无法对此进行测试,但我希望它仍然有效:

      var list = Model.SelectMany(x => x.Tags).GroupBy(x => x.Name, g => new {Name = g.Key, Amount = g.Count()});
      

      返回一个包含标签名称及其各自数量的列表。

      【讨论】:

      • 感谢您的回答!我对 MVC3 很陌生,所以我不太明白你刚刚写了什么。你能详细说明吗?我在下面的评论中提出了解决方案....但是我遇到了一个新问题,我认为您对此有所了解!
      • 基本上它是一个 LINQ-Query(以匿名 lambda 函数的形式编写,我更喜欢这种语法)。第一种方法 SelectMany 将获取所有标签集合,然后将它们组成一个大数组。 GroupBy 方法的工作方式类似于 SQL Group By,它按属性 Name 进行分组,然后使用 Count() 计算已分组的标签数量。
      • 非常感谢您的描述!当我习惯了传统的 ASP.NET 时,使用 ASP.NET 有点混乱。你能明白为什么我的代码没有从数据库中收集所有标签吗?它只显示当前页面上的标签...
      • 显然你的控制器只给你的视图当前页面的帖子,所以你需要改变控制器也给视图标签云。您可以像这样为视图提供几个变量: return View(new Tuple(Posts, TagCloud));在视图中,您需要分别访问 Model.Item1 和 Model.Item2 (或者,如果您想干净利落地执行此操作,请创建一个 View-Model 并仅返回它)
      【解决方案3】:

      你可以试试this jquery 插件。基本上你应该根据标签对所有帖子进行分组。

      <div id="tagCloud">
        foreach(var tag in Tags)
        {
          <a href="@tag.Path()" rel="@tag.Posts.Count">@tag.Name</a>
        }
      </div>
      
      $.fn.tagcloud.defaults = {
        size: {start: 14, end: 18, unit: 'pt'},
        color: {start: '#cde', end: '#f52'}
      };
      
      $(function () {
        $('#tagCloud a').tagcloud();
      });
      

      【讨论】:

      • 谢谢马克!我不想在这里使用 JQuery,但我确实理解这个想法!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-14
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      相关资源
      最近更新 更多