Как получить доступ к коллекциям в NameValueCollection, возвращаемым HttpUtility.ParseQueryString?

Использование С#, .net 4.0

Я использую HttpUtility.ParseQueryString для анализа URI mailto, как таковой:

MailMessage message = new MailMessage();
NameValueCollection mailTo = System.Web.HttpUtility.ParseQueryString(mailToUri.OriginalString.Split('?')[1]);
message.Subject = mailTo["subject"];

URI может иметь несколько параметров "to", например:

mailto://[email protected]&[email protected]&[email protected]&subject=test&body=this%20should%20be%20the%20body"

При выполнении кода я вижу, что ParseQueryString создает коллекцию mailTo["to"] NameValueCollection, содержащую один ключ "to" с несколькими значениями, который выглядит как объект типа System.Collections.Specialized.NameObjectCollectionBase.NameObjectEntry.

Я уверен, что упускаю что-то простое. Я не смог понять, как перебирать эту коллекцию и получать каждое отдельное значение. Я бы искал что-то вроде этого, что явно не работает:

        foreach (String address in mailTo["to"])
        {
            message.To.Add(new MailAddress(address));
        }

Кроме того, если вы знаете лучший способ перейти от mailto URI к SMTP-сообщению, я весь в глаза.


person kscott    schedule 29.08.2011    source источник


Ответы (3)


часть значения NameValueCollection представляет собой строку. Таким образом, для ключа «кому» это будет строка адресов электронной почты с разделителями-запятыми.

string s = "[email protected]&[email protected]&[email protected]&subject=test";
var items = System.Web.HttpUtility.ParseQueryString(s);

foreach(string email in items["to"].Split(','))
{
    Console.Out.WriteLine(email);
}

приводит к следующему

[email protected]
[email protected]
[email protected]
person CraigW    schedule 29.08.2011
comment
Конечно, так просто. Просмотр элемента [to] в отладке разбивает значения на коллекцию, а не показывает одно значение с разделителями-запятыми, что ведет меня по всем неправильным путям. Спасибо. - person kscott; 30.08.2011

Чтобы ответить на ваш вопрос, не предлагая альтернативного решения, попробуйте следующее:

     foreach (var value in mailTo.GetValues("to"))
     {
        Debug.WriteLine(value);
     }
person Jacob Tabak    schedule 29.08.2011
comment
Намного лучше, потому что вам не нужно беспокоиться о каких-либо исходных значениях, содержащих запятую. - person teedyay; 08.05.2013

mailTo["to"] — это просто строка, содержащая адреса, разделенные запятыми, которые вы можете разделить и проанализировать следующим образом:

    foreach (var address in mailTo["to"].Split(','))
    {
        message.To.Add(new MailAddress(address));
    }
person Philipp Schmid    schedule 29.08.2011