2008-10-19 85 views
3

我正在为正在重新设计的大型网站做一个自定义404页面。客户可能已经收藏了大约40个高用量页面,而我们的新网站结构将打破这些书签。ASP.NET键/值列表

在我的自定义404页面上,如果他们尝试通过其旧URL导航到其中一个高度使用的页面,我想提醒他们新的URL。所以我在404页面上有几个动态控件,一个用于“你想要这个吗?”类型的对话框,另一个用于“如果这么想去(在这里更新书签)”类型的对话框。这是很容易的部分。

要提出一个新的URL,我正在查看请求的URL。如果它包含关键词,我将根据这个建议新的URL,并且我正在解雇你想要的合适的......,如果......那么......关于404的建议如上所述。

因此,我想将这些40个关键字/值对(关键字/新网址对)存储在数据结构中,我不确定最好。字典? IDictionary的?有什么区别,哪个更合适?

还是我完全在错误的轨道上?

谢谢你的时间。

回答

4

我会使用System.Collections.Generic命名空间中的字典< T,T >。

2

您可以使用NameValueCollection。

1

字典将会很好。将它存储为接口类型的IDictionary或Dictionary本身在这种情况下并不重要,因为除了404页面本身之外,它不会被传递太多。

你有没有考虑做一些URL重写,仍然支持旧的URL?

1

你可以考虑写自己的类逻辑,然后赋值给一个列表数据结构如下:

public class KeyValuesClass 
{ 
    private string a_key; 
    private string a_value; 

    public KeyValuesClass(string a_key, string a_value) 
    { 
      this.a_key = a_key; 
      this.a_value = a_value; 
    } 

    public string Key 
    { 
     get{ return a_key; } 
     set { a_key = value; } 
    } 

    public string Value 
    { 
     get{ return a_value; } 
     set { a_value = value; } 
    } 

} 

代码

List<KeyValuesClass> my_key_value_list = new List<KeyValuesClass>(); 
my_key_value_list.Add(new KeyValuesClass("key", "value"); 

的地方,但你可以考虑解释为我们的同胞程序员在上面提到它:)

+0

为什么你会在框架提供完美的通用版本时创建自己的KeyValuePair类? – 2008-10-19 21:47:33

2

也许这对你的用例来说是过量的,但是我可能会允许每个Uri有多个关键字,并且有一个相对权重分数。然后,动态评分匹配的关键字。

class UriSuggester { 
    private List<SuggestedUri> Uris { get; set; } 

    Uri[] GetSuggestions(Uri originalUri) { 
     var suggestionHits = new Dictionary<SuggestedUri, int>(); 
     foreach (var keyword in KeyWords.Parse(originalUri)) { 
     // find suggestions matching that keyword 
     foreach (var suggestedUri in Uris.Where(u => u.Keywords.Contains(keyword)) { 
      // add a hit for keyword match 
      suggestionHits[suggestedUri] += 1; 
     } 
     } 
     // order by weight * hits 
     return suggestionHits.Keys 
     .OrderBy(s => s.Weight * suggestionHits[s]) 
     .Select(s => s.Uri) 
     .ToArray(); 
    } 
} 

class SuggestedUri { 
    public Uri Suggested { get; set; } 
    public int Weight { get; set; } 
    public Keyword[] Keywords; 
} 

class Keyword { 
    public string Value { get; set; } 
    public static Keyword[] Parse(Uri uri); 
    override Equals; 
    override GetHashCode; 
}