Используя RouteValueDictionary, чтобы преобразовать анонимный тип для строки запроса


Я пытаюсь воспользоваться отражением встроенный в RouteValueDictionary, чтобы добавить значения в строку запроса URL-адреса. Это то, что я придумал. Это, кажется, работает, но я думал, я бы разместить его, чтобы увидеть, если кто имеет какие-либо предложения. Он также использует супер-секретной HttpValueCollection возвращаемых ParseQueryString(), который автоматически генерирует url-кодированной строки запроса.

Пока единственный минус в том, что он работает только на адреса, которые могут быть проанализированы UriBuilder (т. е. абсолютные URL-адреса). Так, относительные URL-адреса (т. е. "/домашний/индекс") будет бросать исключение. Может быть, я должен попробовать UriBuilder, и если это не удается, то попробуйте извлечь/добавить строку запроса вручную.

public static string AppendQueryValues(this string absoluteUrl, object queryValues)
{
    if (absoluteUrl == null)
        throw new ArgumentNullException("absoluteUrl");
    if (queryValues == null)
        throw new ArgumentNullException("queryValues");

    // Parse URL so we can modify the query string
    var uriBuilder = new UriBuilder(absoluteUrl);

    // Parse query string into an HttpValueCollection
    var queryItems = HttpUtility.ParseQueryString(uriBuilder.Query);

    // Parse & filter queryValues (using reflection) into key/value pairs
    var newQueryItems = new RouteValueDictionary(queryValues)
        .Where(x => !queryItems.AllKeys.Contains(x.Key));

    // Add new items to original collection
    foreach (var newQueryItem in newQueryItems)
    {
        queryItems.Add(newQueryItem.Key, newQueryItem.Value.ToString());
    }

    // Save new query string (HttpValueCollection automatically URL encodes)
    uriBuilder.Query = queryItems.ToString();

    return uriBuilder.Uri.AbsoluteUri;
}


6925
6
задан 22 июня 2011 в 06:06 Источник Поделиться
Комментарии
1 ответ

Вместо того, чтобы ловить исключение, если URL-адрес является относительным, используйте систему.Ури классе, чтобы увидеть, если он является абсолютным URI.

2
ответ дан 12 октября 2012 в 09:10 Источник Поделиться