web-dev-qa-db-ja.com

C#でクエリ文字列を更新する方法は?

URLのどこかに&sortBy = 6があります。ボタンクリックでこれを&sortBy = 4または&sortBy = 2に更新するにはどうすればよいですか?正しいリダイレクトURLを作成するには、カスタム文字列関数を作成する必要がありますか?

クエリ文字列変数を追加する必要がある場合は、

string completeUrl = HttpContext.Current.Request.Url.AbsoluteUri + "&" + ...
Response.Redirect(completeUrl);

しかし、私がしたいのは、既存のクエリ文字列変数を変更することです。

44
developer747

既存のQueryString値を変更するには、次のアプローチを使用します。

var nameValues = HttpUtility.ParseQueryString(Request.QueryString.ToString());
nameValues.Set("sortBy", "4");
string url = Request.Url.AbsolutePath;
Response.Redirect(url + "?" + nameValues); // ToString() is called implicitly

別の応答 で詳しく説明します。

117
Ahmad Mageed

sortbyのクエリ文字列を取得し、次のように完全なUrlでstring replaceを実行します。

string sUrl = *retrieve the required complete url*
string sCurrentValue = Request.QueryString["sortby"];
sUrl = sUrl.Replace("&sortby=" + sCurrentValue, "&sortby=" + newvalue);

それがどうなるか教えてください:)

幸運を

7
m.othman
    private void UpdateQueryString(string queryString, string value)
    {
        PropertyInfo isreadonly = typeof(System.Collections.Specialized.NameValueCollection).GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
        isreadonly.SetValue(this.Request.QueryString, false, null);
        this.Request.QueryString.Set(queryString, value);
        isreadonly.SetValue(this.Request.QueryString, true, null);
    }
5
Mathias Nohall

これが本当に必要な場合は、クエリ文字列が変更された新しい同じページにリダイレクトする必要があります。すでに人々が答えています。これにより、ページが再び読み込まれ、クエリ文字列を変更するためだけにページが再度読み込まれますが、これは良い方法ではありません。

しかし、なぜこれが必要なのですか?

SortByの値を6から4に変更してアプリケーション内のすべての場所で使用する場合は、クエリ文字列の値を変数またはビューステートに保存し、そのビューステートをどこでも使用することをお勧めします。

例えば.

page_Loadで次のように書くことができます

if (!IsPostBack)
{
  ViewState["SortBy"] = Request.QueryString["sortBy"];
}

他のすべての場所(ポストバック後でも)で、ViewState ["SortBy"]を使用できます。

2
Imran Rizvi

Ahmad Solutionに基づいて、一般的に使用できる次のメソッドを作成しました

private string ModifyQueryStringValue(string p_Name, string p_NewValue)
{

    var nameValues = HttpUtility.ParseQueryString(Request.QueryString.ToString());
    nameValues.Set(p_Name, p_NewValue);
    string url = Request.Url.AbsolutePath;
    string updatedQueryString = "?" + nameValues.ToString();
    return url + updatedQueryString;
}

そして、次のようにそれを私たち

Response.Redirect(ModifyQueryStringValue("SortBy","4"));
1
user2832159

windows.open を使用して、クライアントサイドでJavaScriptを使用してクエリ文字列を作成し、ページをリダイレクトできます。

それ以外の場合は、サーバー側でResponse.RedirectまたはServer.Transferを使用できます。

0
Strillo

SolrNetには、非常に役立つUrl拡張メソッドがいくつかあります。 http://code.google.com/p/solrnet/source/browse/trunk/SampleSolrApp/Helpers/UrlHelperExtensions.cs?r=512

    /// <summary>
    /// Sets/changes an url's query string parameter.
    /// </summary>
    /// <param name="helper"></param>
    /// <param name="url">URL to process</param>
    /// <param name="key">Query string parameter key to set/change</param>
    /// <param name="value">Query string parameter value</param>
    /// <returns>Resulting URL</returns>
    public static string SetParameter(this UrlHelper helper, string url, string key, string value) {
        return helper.SetParameters(url, new Dictionary<string, object> {
            {key, value}
        });
    }
0
James Hull

サーバー側のコードで次の方法でクエリ文字列の置換を実行できると思います。

NameValueCollection filtered = new NameValueCollection(request.QueryString);

filtered.Remove("SortBy");
filtered.Add("SortBy","4");
0
legrandviking

クエリ文字列はサーバーに渡されます。クエリ文字列は好きな文字列として扱うことができますが、ページが再び読み取る準備ができるまで(つまり、サーバーに返送されるまで)何もしません。そのため、クエリ文字列の値を処理する方法を尋ねる場合は、単にRequest.QueryString ["key"]にアクセスするだけです。サーバーがクエリ文字列のこの「変更」を考慮したい場合は、新しい値でページを効果的にリロードする必要があります。そのため、再度URLを作成しますpage.aspx?id=30たとえば、これをリダイレクトメソッドに渡します。

0
SkonJeet

新しいURLにリダイレクトする必要があります。リダイレクトする前にサーバーで何らかの作業を行う必要がある場合は、コードでResponse.Redirect(...)を使用する必要があります。サーバーで作業する必要がない場合は、HyperLinkを使用して事前にレンダリングするだけです。

実際のURLの構築について質問している場合、私は仕事をすることができる組み込み関数を知りません。 PathsおよびQueryString引数に定数を使用して、コード全体で定数を繰り返すことを回避できます。

riBuilder は、URLの構築には役立ちますが、クエリ文字列の構築には役立ちません

0
Stilgar

QueryStringを変更する必要がある唯一の方法は、新しいQueryStringを使用して同じページにリダイレクトすることです。

Response.Redirect("YourPage.aspx?&sortBy=4")

http://msdn.Microsoft.com/en-us/library/a8wa7sdt(v = vs.100).aspx

0