2012-09-23 53 views
1

我正在使用ASP.NET MVC3創建一個博客,並且我想爲它創建一個tagCloud。使用taglink創建標籤雲?

現在我的問題是我如何將它列入一個列表(我需要?),計數,然後打印出不同的大小?

編輯:

我現在能指望每一個標籤在每一個崗位有以下幾點:

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> 

感謝您的任何幫助!

回答

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> 

感謝您的任何幫助!

0

我無法測試這一點,但我希望這個作品反正:

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

返回標記名稱和它們各自的量的列表。

+0

感謝您的回答!我對MVC3真的很陌生,所以我不太瞭解你寫的東西。你能詳細說明嗎?我在下面的評論中提供了一個解決方案....但是我遇到了一個新問題,我認爲你有一點線索! –

+0

基本上它是一個LINQ-Query(用匿名lambda函數的形式編寫,我更喜歡這種語法)。第一種方法SelectMany將獲得標籤的所有集合,然後將一個大的數組排除在外。 GroupBy方法像SQL Group By一樣工作,它按屬性Name進行分組,然後計算已使用Count()分組的標籤數量。 –

+0

非常感謝您的描述!當我習慣使用傳統的ASP.NET時,使用ASP.NET有點麻煩。你能看到爲什麼我的代碼不收集數據庫中的所有標籤嗎?它只顯示當前頁面上的標籤... –

0

你可以試試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(); 
}); 
+0

感謝Mark!我寧願不使用JQuery,但我理解這個想法! –