私は次のコードを持っています:
string Keys = string.Join(",",FormValues.AllKeys);
私はgetをいじろうとしていました:
string Values = string.Join(",", FormValues.AllKeys.GetValue());
しかし、もちろんそれは機能しません。
すべての値を取得するために似たようなものが必要ですが、同じことをするための適切なコードが見つからないようです。
追伸:コードの最初の行の目的に反するので、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();
_
Reflectorを使用して見つけたように、_NameValueCollection.AllKeys
_はループをすべて実行してすべてのteキーを収集するため、c.Cast<string>()
の方が望ましいようです。
string values = string.Join(",", collection.AllKeys.Select(key => collection[key]));
_string values =
string.Join(",", FormValues.AllKeys.SelectMany(key => FormValues.GetValues(key)));
_
編集:他の答えはあなたが望むものかもしれませんし、そうでないかもしれません。シンプルに見えますが、結果はすべての状況であなたが探しているものではないかもしれませんが、それでもまたそうかもしれません(あなたの走行距離は異なるかもしれません)。
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つの文字列に結合しているため、この格差は隠されています。ただし、感嘆符などの別の値に参加している場合、他の回答の結果は次のようになります。
_"1,2!3"
_
そして、ここのコードは
_"1!2!3"
_
好みの動作を示すスニペットを使用してください。
以下は、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
System.Web.HttpUtility.ParseQueryString(...)を使用してクエリ文字列を解析した場合は、ToString()を使用するだけでよく、車輪を再発明する必要はありません。
結果がNameValueCollectionであっても、基になる型はHttpValueCollectionであり、クエリ文字列を構築するために必要なToString()オーバーライドがあります。
ログメカニズムとしてAzure DocumentDBを使用しているため、動的オブジェクトを作成していますが、Gist ...
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形式の応答を返します。それ以外の場合、カスタムエラーページを返します。