Невозможно преобразовать из Http.QueryString в System.collections.IEqualityComparer [duplicate]

Java всегда передает аргументы по значению NOT по ссылке.


Позвольте мне объяснить это с помощью примера :

public class Main{
     public static void main(String[] args){
          Foo f = new Foo("f");
          changeReference(f); // It won't change the reference!
          modifyReference(f); // It will modify the object that the reference variable "f" refers to!
     }
     public static void changeReference(Foo a){
          Foo b = new Foo("b");
          a = b;
     }
     public static void modifyReference(Foo c){
          c.setAttribute("c");
     }
}

объясните это поэтапно:

  1. Объявление ссылки с именем f типа Foo и присвоение ее новому объекту типа Foo с атрибутом "f".
    Foo f = new Foo("f");
    
    enter image description here [/g1]
  2. Со стороны метода указывается ссылка типа Foo с именем a и изначально назначена null.
    public static void changeReference(Foo a)
    
    enter image description here [/g2]
  3. Когда вы вызываете метод changeReference, ссылка a будет назначена объекту, который передается в качестве аргумента.
    changeReference(f);
    
    enter image description here [/g3]
  4. Объявление ссылки с именем b типа Foo и присвоение ее новому объекту типа Foo с атрибутом "b".
    Foo b = new Foo("b");
    
    enter image description here [/g4]
  5. a = b переназначает ссылку a NOT f объекту, чей его атрибут "b". enter image description here [/g5]
  6. Как вы называете метод modifyReference(Foo c), для объекта с атрибутом "f" создается и назначается ссылка c. enter image description here [/g6]
  7. c.setAttribute("c"); изменит атрибут объекта, на который указывает ссылка c, и это тот же объект, на который указывает ссылка f. enter image description here [/g7]

Надеюсь, теперь вы понимаете, как объекты передачи в качестве аргументов работают в Java:)

65
задан Community 23 May 2017 в 10:31
поделиться

5 ответов

Я понял, что вы можете сделать это с помощью Microsoft.AspNetCore.WebUtilities.QueryHelpers в пакете Microsoft.AspNetCore.WebUtilities .

Разбирать его в словаре:

var uri = new Uri(context.RedirectUri);
var queryDictionary = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(uri.Query);

Обратите внимание, что в отличие от ParseQueryString в System.Web это возвращает словарь типа IDictionary<string, string[]>, поэтому значение представляет собой массив строк. Так как словарь обрабатывает несколько параметров строки запроса с тем же именем.

Если вы хотите добавить параметр в строку запроса, вы можете использовать другой метод в QueryHelpers:

var parametersToAdd = new System.Collections.Generic.Dictionary<string, string> { { "resource", "foo" } };
var someUrl = "http://www.google.com";
var newUri = Microsoft.AspNetCore.WebUtilities.QueryHelpers.AddQueryString(someUrl, parametersToAdd);
90
ответ дан vcsjones 19 August 2018 в 04:19
поделиться
  • 1
    FYI, пакет WebUtilities несовместим с .net core 1.0. Возможно, вам понадобится Microsoft.AspNetCore.WebUtilities. – Jaime 1 July 2016 в 09:15
  • 2
    @Jaime Удивительное наблюдение! Можете ли вы отредактировать мой ответ с этим обновлением, чтобы получить кредит? – vcsjones 1 July 2016 в 13:57
  • 3
    Издание сделано. Сохранение старого пространства имен для версий старых версий .net. – Jaime 1 July 2016 в 20:38
  • 4
    Похоже, что использование QueryHelpers.AddQueryString автоматически упростит использование UrlEscape. – Josh 7 July 2016 в 04:29
  • 5
    Возвращаемый тип теперь IDictionary & lt; string, StringValues ​​& gt; а не IDictionary & lt; string, string [] & gt; – btlog 18 February 2018 в 00:50

Самый простой и интуитивно понятный способ получить абсолютный URI и манипулировать его строкой запроса с использованием пакетов ASP.NET Core, можно сделать несколькими простыми шагами:

Установить пакеты

PM> Install-Package Microsoft.AspNetCore.WebUtilities PM> Install-Package Microsoft.AspNetCore.Http.Extensions

Важные классы

Чтобы указать на них, вот два важных класса, которые мы будем использовать: QueryHelpers , StringValues ​​, QueryBuilder .

Код

// Raw URI including query string with multiple parameters
var rawurl = "https://bencull.com/some/path?key1=val1&key2=val2&key2=valdouble&key3=";

// Parse URI, and grab everything except the query string.
var uri = new Uri(rawurl);
var baseUri = uri.GetComponents(UriComponents.Scheme | UriComponents.Host | UriComponents.Port | UriComponents.Path, UriFormat.UriEscaped);

// Grab just the query string part
var query = QueryHelpers.ParseQuery(uri.Query);

// Convert the StringValues into a list of KeyValue Pairs to make it easier to manipulate
var items = query.SelectMany(x => x.Value, (col, value) => new KeyValuePair<string, string>(col.Key, value)).ToList();

// At this point you can remove items if you want
items.RemoveAll(x => x.Key == "key3"); // Remove all values for key
items.RemoveAll(x => x.Key == "key2" && x.Value == "val2"); // Remove specific value for key

// Use the QueryBuilder to add in new items in a safe way (handles multiples and empty values)
var qb = new QueryBuilder(items);
qb.Add("nonce", "testingnonce");
qb.Add("payerId", "pyr_");

// Reconstruct the original URL with new query string
var fullUri = baseUri + qb.ToQueryString();

Чтобы обновляться с любыми изменениями, вы можете узнать об этом в моем блоге: http://benjii.me/2017 / 04 / синтаксический анализ изменение-запрос-строка-Asp-нетто-ядро /

18
ответ дан Ben Cull 19 August 2018 в 04:19
поделиться

Важно отметить, что за время, прошедшее с того момента, как верхний ответ был помечен как правильный, у Microsoft.AspNetCore.WebUtilities было значительное обновление версии (от 1.xx до 2.xx).

, если вы создаете против netcoreapp1.1, вам нужно будет запустить следующее, в котором установлена ​​последняя поддерживаемая версия 1.1.2:

Install-Package Microsoft.AspNetCore.WebUtilities -Version 1.1.2

0
ответ дан pimbrouwers 19 August 2018 в 04:19
поделиться

Эта функция возвращает Dictionary<string, string> и не использует Microsoft.xxx для совместимости

Принимает кодировку параметра с обеих сторон

Принимает дубликаты клавиш (последнее значение возврата)

var rawurl = "https://emp.com/some/path?key1.name=a%20line%20with%3D&key2=val2&key2=valdouble&key3=&key%204=44#book1";
var uri = new Uri(rawurl);
Dictionary<string, string> queryString = ParseQueryString(uri.Query);

// queryString return:
// key1.name, a line with=
// key2, valdouble
// key3, 
// key 4, 44

public Dictionary<string, string> ParseQueryString(string requestQueryString)
{
    Dictionary<string, string> rc = new Dictionary<string, string>();
    string[] ar1 = requestQueryString.Split(new char[] { '&', '?' });
    foreach (string row in ar1)
    {
        if (string.IsNullOrEmpty(row)) continue;
        int index = row.IndexOf('=');
        if (index < 0) continue;
        rc[Uri.UnescapeDataString(row.Substring(0, index))] = Uri.UnescapeDataString(row.Substring(index + 1)); // use Unescape only parts          
     }
     return rc;
}
4
ответ дан Wagner Pereira 19 August 2018 в 04:19
поделиться
  • 1
    Это работает, но вы должны добавить проверку индекса перед началом подстроки, так как есть вероятность, что строка не содержит '='. Это вызывает исключение. – Taurib 19 April 2018 в 18:38
  • 2
    Спасибо @Taurib за помощь, изменили – Wagner Pereira 27 April 2018 в 14:33

HttpRequest имеет свойство Query, которое предоставляет анализируемую строку запроса через интерфейс IReadableStringCollection :

/// <summary>
/// Gets the query value collection parsed from owin.RequestQueryString.
/// </summary>
/// <returns>The query value collection parsed from owin.RequestQueryString.</returns>
public abstract IReadableStringCollection Query { get; }

Это обсуждение на GitHub указывает на это также.

15
ответ дан Yuval Itzchakov 19 August 2018 в 04:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: