【问题标题】:ASP.Net/C# convert NameValueCollection to IDictionary?ASP.Net/C# 将 NameValueCollection 转换为 IDictionary?
【发布时间】:2013-04-24 20:54:57
【问题描述】:

我正在努力帮助我儿子升级我去年为他建立的网站。他想实施 Amazon Simple Pay。我非常接近它,但有一个我不知道如何解决的错误。这是一个用 C# 编写的 ASP.Net 站点。我是一个未经培训(自学)的开发人员,所以请简单地说。 ;-)

在 ASP.Net 中,在表单中包含表单是不合法的,我需要执行表单 POST。网上有一个非常漂亮的教程,展示了如何做到这一点。如果您有兴趣查看,网址是 http://weblogs.asp.net/hajan/archive/2011/04/20/amazon-simple-pay-in-asp-net.aspx

交易必须“签名”,亚马逊提供了一个 SignatureUtils 类来完成此操作。在那个班级里,我这样称呼:

public static string signParameters(IDictionary<String, String> parameters, String key, String HttpMethod, String Host, String RequestURI, String algorithm) 

让我很头疼的是 IDictionary 参数。我必须传递的是我构建的这个 ListParams NameValueCollection:

public System.Collections.Specialized.NameValueCollection ListParams = new System.Collections.Specialized.NameValueCollection();

它给了我下面的错误,因为它无法将 NameValueCollection 转换为 IDictionary。我尝试明确转换它,但没有喜悦。我该如何解决这个问题?

Error: Argument 1: cannot convert from 'System.Collections.Specialized.NameValueCollection' to 'System.Collections.Generic.IDictionary<string,string>'

【问题讨论】:

  • 看看:stackoverflow.com/a/5600582/254973 好像答案有代码可以把东西送到IDictonary
  • Steven,那篇文章应该对我有用,但 .ToDictionary 因其保护级别而给我一个无法访问的错误。它是公开的,所以我不确定是什么导致了这个错误。

标签: c# asp.net namevaluecollection


【解决方案1】:

您可以使用Cast

IDictionary<string, string> dict = ListParams.Cast<string>()
    .ToDictionary(p => p, p => ListParams[p]);

【讨论】:

  • mattytommo,这个方案和上面 Steven 提出的方案很相似。当我尝试实现它时,我被告知 NameValueCollection 不包含“Cast”的定义,我将尝试以不同的方式对其进行转换,并且一直在考虑简单地重写创建 NameValueCollection 的代码。这也可能是一种选择。
  • @DJGray 添加对System.Linq的使用引用
  • 感谢 mattytommo。上周我刚刚阅读了一篇关于 Linq 的在线文章。这是我还没用过的东西,但听起来很强大,值得我学习如何利用它。
【解决方案2】:

您还可以通过AllKeys 属性将NameValueCollection“转换”为Dictionary&lt;string, string&gt;

var dictionary = nameValueCollection.AllKeys
    .ToDictionary(k => k, k => nameValueCollection[k]);

【讨论】:

    【解决方案3】:

    沙赞!!知道了!解决方案是更改 Hajan 提供的示例代码以实现 Dictionary 而不是 NameValueCollection。然后我需要将 PaymentGatewayPost 中的 while 循环更改为 foreach 循环,如下所示:

    foreach (KeyValuePair<string, string> pair in ListParams)
    {
        System.Web.HttpContext.Current.Response.Write(string.Format("<input name=\"{0}\" type=\"hidden\" value=\"{1}\">",
        pair.Key,
        pair.Value));
    }
    

    瞧!!它构建没有错误。

    感谢大家的帮助。希望这将帮助其他正在努力使用 Amazon Simple Pay 的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多