Domanda

Sto implementando un controllo personalizzato e in questo controllo devo scrivere una serie di collegamenti alla pagina corrente, ognuno con un parametro di query diverso.Devo mantenere intatta la stringa di query esistente e aggiungere (o modificare il valore di) un elemento di query aggiuntivo (ad es."pagina"):

"Default.aspx?page=1"
"Default.aspx?page=2"
"Default.aspx?someother=true&page=2"

eccetera.

Esiste un semplice metodo di supporto che posso utilizzare nel metodo Render...ehm...Piace:

Page.ClientScript.SomeURLBuilderMethodHere(this,"page","1");
Page.ClientScript.SomeURLBuilderMethodHere(this,"page","2");

Ciò si occuperà di generare un URL corretto, mantenere gli elementi della stringa di query esistenti e non creare duplicati, ad es.pagina=1&pagina=2&pagina=3?

Arrotolare il mio sembra un compito davvero poco attraente.

È stato utile?

Soluzione

Temo di non conoscere alcun metodo integrato per questo, usiamo questo metodo che prende la querystring e imposta i parametri

    /// <summary>
    /// Set a parameter value in a query string. If the parameter is not found in the passed in query string,
    /// it is added to the end of the query string
    /// </summary>
    /// <param name="queryString">The query string that is to be manipulated</param>
    /// <param name="paramName">The name of the parameter</param>
    /// <param name="paramValue">The value that the parameter is to be set to</param>
    /// <returns>The query string with the parameter set to the new value.</returns>
    public static string SetParameter(string queryString, string paramName, object paramValue)
    {
        //create the regex
        //match paramname=*
        //string regex = String.Format(@"{0}=[^&]*", paramName);
        string regex = @"([&?]{0,1})" + String.Format(@"({0}=[^&]*)", paramName);

        RegexOptions options = RegexOptions.RightToLeft;
        // Querystring has parameters...
        if (Regex.IsMatch(queryString, regex, options))
        {
            queryString = Regex.Replace(queryString, regex, String.Format("$1{0}={1}", paramName, paramValue));
        }
        else
        {
            // If no querystring just return the Parameter Key/Value
            if (queryString == String.Empty)
            {
                return String.Format("{0}={1}", paramName, paramValue);
            }
            else
            {
                // Append the new parameter key/value to the end of querystring
                queryString = String.Format("{0}&{1}={2}", queryString, paramName, paramValue);
            }
        }
        return queryString;
    }

Ovviamente potresti usare QueryString NameValueCollection dell'oggetto URI per facilitare la ricerca dei valori, ma volevamo essere in grado di analizzare qualsiasi stringa di query.

Altri suggerimenti

Oh, abbiamo anche questo metodo che ti consente di inserire un'intera stringa URL senza dover estrarre la stringa di query

public static string SetParameterInUrl(string url, string paramName, object paramValue)
{
    int queryStringIndex = url.IndexOf("?");
    string path;
    string queryString;
    if (queryStringIndex >= 0 && !url.EndsWith("?"))
    {
        path = url.Substring(0, queryStringIndex);
        queryString = url.Substring(queryStringIndex + 1);
    }
    else
    {
        path = url;
        queryString = string.Empty;
    }
    return path + "?" + SetParameter(queryString, paramName, paramValue);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top