Подтвердить что ты не робот

Получить все значения NameValueCollection для строки

У меня есть следующий код:

string Keys = string.Join(",",FormValues.AllKeys);

Я пытался поиграть с get:

string Values = string.Join(",", FormValues.AllKeys.GetValue());

Но, конечно, это не работает.

Мне нужно что-то подобное, чтобы получить все значения, но я, похоже, не нашел подходящий код для этого.

P.S: Я не хочу использовать цикл foreach, поскольку это превосходит цель первой строки кода.

4b9b3361

Ответ 1

var col = new NameValueCollection() { { "a", "b" }, { "1", "2" } }; // collection initializer

var values = col.Cast<string>().Select(e => col[e]); // b, 2

var str = String.Join(",", values );  // "b,2"

Также вы можете создать метод расширения:

public static string Join(this NameValueCollection collection, Func<string,string> selector, string separator)
{
    return String.Join(separator, collection.Cast<string>().Select(e => selector(e)));
}

Использование:

var s = c.Join(e => String.Format("\"{0}\"", c[e]), ",");

Также вы можете легко преобразовать NameValueCollection в более удобный Dictionary<string,string> так:

public static IDictionary<string,string> ToDictionary(this NameValueCollection col)
{
    return col.AllKeys.ToDictionary(x => x, x => col[x]);
}

дает:

var d = c.ToDictionary();

Как я нашел, используя Reflector, NameValueCollection.AllKeys внутренне выполняет цикл для сбора всех ключей te, поэтому кажется, что c.Cast<string>() более предпочтительный.

Ответ 2

string values = string.Join(",", collection.AllKeys.Select(key => collection[key]));

Ответ 3

string values = 
    string.Join(",", FormValues.AllKeys.SelectMany(key => FormValues.GetValues(key)));

Изменить: Другие ответы могут быть или не быть тем, что вы хотите. Они выглядят проще, но результаты могут быть не такими, какие вы ищете при любых обстоятельствах, но опять же, они могут быть (ваш пробег может отличаться).

Обратите внимание, что a NameValueCollection не является отображением 1:1, как словарь. Вы можете добавить несколько значений для одного и того же ключа, поэтому функция типа .GetValues(key) возвращает массив, а не одну строку.

Если у вас есть коллекция, в которую вы добавили

 collection.Add("Alpha", "1");
 collection.Add("Alpha", "2");
 collection.Add("Beta", "3");

Извлечение collection["Alpha"] дает "1,2". Получение collection.GetValues("Alpha") дает { "1", "2" }. Теперь просто случается, что вы используете запятую, чтобы объединить ваши значения в одну строку, поэтому это несоответствие скрыто. Однако, если вы присоединились к другому значению, например восклицательному знаку, результаты других ответов были бы

"1,2!3"

И код здесь будет

"1!2!3"

Используйте фрагмент, демонстрирующий поведение, которое вы предпочитаете.

Ответ 4

Далее создается строка из списка параметров URL.

string.Join(", ", 
            Request.QueryString
                   .AllKeys
                   .Select(key => key + ": " + Request.QueryString[key])
      .ToArray())

то есть

page.aspx?id=75&page=3&size=7&user=mamaci

будет

id: 75, page: 3, size: 7, user: mamaci

Ответ 5

В тех случаях, когда вы проанализировали строку запроса с помощью System.Web.HttpUtility.ParseQueryString(...), вы можете просто использовать ToString(), и вам не нужно повторно изобретать колесо.

Несмотря на то, что результатом является NameValueCollection, базовым типом является HttpValueCollection, у которого есть необходимое ToString() переопределение для построения строки запроса.

Ответ 6

Я использую Azure DocumentDB в качестве моего механизма ведения журнала, поэтому пишу динамический объект, но вы получаете суть...

public class LogErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        int responseCode = new int();

        // Has the exception been handled.  Also, are custom errors enabled
        if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            return;

        // Check if custom exception, if so get response code
        if (filterContext.Exception is CustomException)
            responseCode = (int)((CustomException)filterContext.Exception).Code;

        // Log exception
        string id = Logging.Write(LogType.Error, new
        {
            ResponseCode = responseCode,
            Exception = new
            {
                Message = filterContext.Exception.Message,
                Data = filterContext.Exception.Data,
                Source = filterContext.Exception.Source,
                StackTrace = filterContext.Exception.StackTrace,
                InnerException = filterContext.Exception.InnerException != null ? new
                {
                    Message = filterContext.Exception.InnerException.Message,
                    Data = filterContext.Exception.InnerException.Data,
                    Source = filterContext.Exception.InnerException.Source,
                    StackTrace = filterContext.Exception.InnerException.StackTrace
                } : null
            },
            Context = filterContext.Controller != null ? new
            { 
                RouteData = filterContext.Controller.ControllerContext.RouteData,
                QueryString = filterContext.Controller.ControllerContext.HttpContext.Request.Url.Query,
                FormParams = filterContext.Controller.ControllerContext.HttpContext.Request.Form != null ? string.Join(";#", filterContext.Controller.ControllerContext.HttpContext.Request.Form.AllKeys.Select(key => key + ":" + filterContext.Controller.ControllerContext.HttpContext.Request.Form[key])) : string.Empty,
                Model = (filterContext.Controller is Controller) ? ((Controller)filterContext.Controller).ModelState : null,
                ViewBag = filterContext.Controller.ViewBag,
                ViewData = filterContext.Controller.ViewData
            } : null,
            ActionResult = filterContext.Result != null ? filterContext.Result : null,
            Referrer = filterContext.HttpContext.Request.UrlReferrer != null ? filterContext.HttpContext.Request.UrlReferrer : null
        }).Result;

        // Mark exception as handled and return
        filterContext.ExceptionHandled = true;

        // Test for Ajax call
        if (IsAjax(filterContext))
        {
            // Construct appropriate Json response
            filterContext.Result = new JsonResult()
            {
                Data = new
                {
                    code = responseCode,
                    id = id,
                    message = filterContext.Exception.Message
                },
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };

        }
        else
        {
            var result = new ViewResult();
            result.ViewName = "_CustomError";
            result.ViewBag.CorrelationId = id;
            filterContext.Result = result;
        }
    }

    /// <summary>
    /// Determine if the request is from an Ajax call
    /// </summary>
    /// <param name="filterContext">The request context</param>
    /// <returns>True or false for an Ajax call</returns>
    private bool IsAjax(ExceptionContext filterContext)
    {
        return filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest";
    }
}

У меня есть CustomException, где я проверяю код ответа набора приложений.

Кроме того, я беру querystring, данные формы и модель, чтобы я мог видеть значения, переданные до и после привязки модели.

Если его вызов и Ajax, я возвращаю ответ в формате Json. В противном случае я верну страницу пользовательских ошибок.

Ответ 7

List<string> values = new List<string>();
values.AddRange(all.AllKeys.SelectMany(all.GetValues).Where(getValues => getValues != null));
string Values = string.Join(",", values.ToArray());

Вы можете попробовать что-то вроде выше.