8

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

在 ASP.Net 中,Form 中有一个 Form 是不合法的,我需要做一个 Form POST。网上有一个非常漂亮的教程,展示了如何做到这一点。该 URL 是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>'
4

3 回答 3

8

您可以通过使用来做到这一点Cast

IDictionary<string, string> dict = ListParams.Cast<string>()
    .ToDictionary(p => p, p => ListParams[p]);
于 2013-04-24T21:06:25.280 回答
6

您还可以通过其属性“转换NameValueCollectionDictionary<string, string>a AllKeys

var dictionary = nameValueCollection.AllKeys
    .ToDictionary(k => k, k => nameValueCollection[k]);
于 2016-12-01T23:42:06.047 回答
1

沙赞!!知道了!解决方案是更改 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 的人。

于 2013-04-25T14:00:05.007 回答