2012-03-19 8 views
41

Gdzieś w adresie URL znajduje się & sortBy = 6. Jak zaktualizować to do & sortBy = 4 lub & sortBy = 2 na kliknięciu przycisku? Czy muszę napisać niestandardowe funkcje ciągu, aby utworzyć poprawny adres URL przekierowania?Jak zaktualizować program querystring w języku C#?

Jeśli po prostu trzeba dołączyć zmienną string query zrobiłbym

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

ale to, co chcę zrobić, to zmodyfikować istniejącą zmienną ciągu kwerendy.

+3

Brzmi jak chcesz przekierować do nowego/zaktualizowany adres URL. – mservidio

+0

Nie chodzi o "C#", ale o javascript. dowiedz się o obiekcie 'window.location' – gdoron

+0

tak, to jest poprawne – developer747

Odpowiedz

105

zmodyfikować istniejący Użyj wartości QueryString tego podejścia:

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

idę do bardziej szczegółowo w another response.

+2

To dokładnie to, co chciałem.dziękuję :) – developer747

+2

O tak proste, jak to dostaje . –

+3

To jest najlepsza odpowiedź: http://stackoverflow.com/a/1877016/475882 – jaxxbo

0

Musisz przekierować na nowy adres URL. Jeśli musisz wykonać jakąś pracę na serwerze przed przekierowaniem, musisz użyć Response.Redirect (...) w swoim kodzie. Jeśli nie musisz wykonywać pracy na serwerze, po prostu użyj HyperLink i wyrenderuj go z góry.

Jeśli pytasz o budowę rzeczywistego adresu URL, nie mam informacji o żadnych wbudowanych funkcjach, które mogą wykonać zadanie. Możesz użyć stałych dla argumentów Paths i QueryString, aby uniknąć ich powtarzania po całym kodzie.

UriBuilder może pomóc w budowaniu URL, ale nie ciąg kwerendy

0

Możesz to zrobić z klientem przy pomocy niektórych javascriptów, aby zbudować ciąg zapytania i przekierować stronę przy pomocy windows.open.

W przeciwnym razie można użyć narzędzia Response.Redirect lub Server.Transfer po stronie serwera.

0

SolrNet ma kilka bardzo przydatnych metod rozszerzania adresów 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} 
     }); 
    } 
2

Jeśli naprawdę chcesz tego trzeba przekierować do nowej samej stronie ze zmienionym ciągu kwerendy jako ludzie już odpowiedział. Spowoduje to ponowne załadowanie strony, ponowne ładowanie strony tylko po to, aby zmienić ciąg znaków zapytania, co nie jest dobrą praktyką.

Ale dlaczego tego potrzebujesz?

Jeśli chcesz zmienić wartość sortBy z 6 na 4, aby użyć jej w dowolnym miejscu w aplikacji, moja sugestia polega na przechowywaniu wartości ciągu zapytania w niektórych zmiennych lub stanie widoku i użycia tego stanu widoku wszędzie.

Dla np.

w Page_Load można napisać

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

i wszędzie (nawet po odświeżenie strony) można użyć ViewState [ „SortBy”]

+0

Potrzebuję zachować stan między różnymi stronami. Viewstate działa tylko w przypadku odsyłania do tej samej strony. – developer747

+0

następnie można użyć Sesji zamiast ViewState –

+0

Jestem świadomy opcji po stronie serwera. Mogę również używać plików cookie. Ale jeśli uda mi się uruchomić ciąg zapytania, byłoby to idealne. – developer747

0

Myślę, że można przeprowadzić wymianę łańcucha zapytania w podążanie za modą po stronie serwera.

NameValueCollection filtered = new NameValueCollection(request.QueryString); 

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

Szukam czegoś zgodnie z zaleceniami. Ale jeśli zrobię filtrowanie.Usuń ("SortBy"); usunie również wartość (= 2 "i łańcuch pefix" & "? To jest to, czego potrzebuję. – developer747

+0

Ta metoda udostępnia słownik instrukcji klucz/wartość, gdzie klucz jest nazwą parametru, a wartość jest wartością parametru. Jeśli usuniesz sortBy, to również usuniesz wartość, a &. Będę musiał to wypróbować, aby był w 100% pewny, ale od jakiegoś czasu nie pracowałem nad kodem serwera. – legrandviking

7

Odzyskać ciągu kwerendy z SortBy, następnie wykonać ciąg zastąpić na pełny adres URL następująco:

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

Daj mi znać jak poszło :)

Powodzenia

+0

to też działa, szkoda, nie może ustawić więcej niż jedną odpowiedź jako odpowiedź :( – developer747

+0

Nie martw się, cieszę się, że masz to działa i tak –

0

Ciąg zapytania jest przekazywany do serwera. Możesz traktować ciąg zapytania jako dowolny ciąg znaków, ale nie zrobi on niczego, dopóki strona nie będzie gotowa do ponownego przeczytania (tzn. Odesłania do serwera). Jeśli więc pytasz, jak radzić sobie z wartością ciągu zapytań, po prostu uzyskaj dostęp do niego Request.QueryString ["klucz"]. Jeśli chcesz, aby ta "zmiana" w łańcuchu zapytania była brana pod uwagę przez serwer, wystarczy efektywnie odświeżyć stronę z nową wartością. Więc na przykład skonstruuj adres URL na przykład page.aspx?id=30 i przekaż go do metody przekierowania.

4
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); 
    } 
+0

To jest najlepszy sposób, aby przejść, jeśli nie możesz/nie chcesz używać Response.Redirect lub jakichkolwiek metod odświeżenia – Lucas

1

podstawie Ahmad Rozwiązanie Stworzyłem następującą metodę, która może być używana powszechnie

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; 
} 

a potem nam to następująco

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