Получить все значения NameValueCollection для строки
У меня есть следующий код:
string Keys = string.Join(",",FormValues.AllKeys);
Я пытался поиграть с get:
string Values = string.Join(",", FormValues.AllKeys.GetValue());
Но, конечно, это не работает.
Мне нужно что-то подобное, чтобы получить все значения, но я, похоже, не нашел подходящий код для этого.
P.S: Я не хочу использовать цикл foreach
, поскольку это превосходит цель первой строки кода.
Ответы
Ответ 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());
Вы можете попробовать что-то вроде выше.