我有以下代码:
string Keys = string.Join(",",FormValues.AllKeys);
我试图玩弄get:
string Values = string.Join(",", FormValues.AllKeys.GetValue());
但这当然行不通。
我需要类似的东西来获取所有值,但我似乎没有找到合适的代码来做同样的事情。
PS:我不想使用foreach
循环,因为这超出了第一行代码的目的。
我有以下代码:
string Keys = string.Join(",",FormValues.AllKeys);
我试图玩弄get:
string Values = string.Join(",", FormValues.AllKeys.GetValue());
但这当然行不通。
我需要类似的东西来获取所有值,但我似乎没有找到合适的代码来做同样的事情。
PS:我不想使用foreach
循环,因为这超出了第一行代码的目的。
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();
正如我发现使用反射器,NameValueCollection.AllKeys
在内部执行一个循环来收集所有 te 键,所以它似乎c.Cast<string>()
更可取。
string values = string.Join(",", collection.AllKeys.Select(key => collection[key]));
以下从 URL 参数列表创建一个字符串。
string.Join(", ",
Request.QueryString
.AllKeys
.Select(key => key + ": " + Request.QueryString[key])
.ToArray())
IE
page.aspx?id=75&page=3&size=7&user=mamaci
将会
id: 75, page: 3, size: 7, user: mamaci
string values =
string.Join(",", FormValues.AllKeys.SelectMany(key => FormValues.GetValues(key)));
编辑:其他答案可能是也可能不是您想要的。它们看起来更简单,但结果可能不是您在所有情况下都在寻找的结果,但话又说回来,它们可能是(您的里程可能会有所不同)。
请注意, aNameValueCollection
不是像字典那样的 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"
使用演示您喜欢的行为的代码段。
我使用 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,我在其中检查应用程序设置的响应代码。
此外,我使用查询字符串、表单数据和模型,以便查看模型绑定器之前和之后传递的值。
如果它和 Ajax 调用,我返回一个 Json 格式的响应。否则,我会返回一个自定义错误页面。
如果您使用 System.Web.HttpUtility.ParseQueryString(...) 解析了查询字符串,则可以只使用 ToString() 而不必重新发明轮子。
尽管结果是 NameValueCollection,但底层类型是 HttpValueCollection,它具有必要的 ToString() 覆盖来构建查询字符串。
List<string> values = new List<string>();
values.AddRange(all.AllKeys.SelectMany(all.GetValues).Where(getValues => getValues != null));
string Values = string.Join(",", values.ToArray());
你可以试试上面的方法。