Question

Je suis la mise en œuvre d'un contrôle personnalisé et dans ce contrôle j'ai besoin d'écrire un tas de liens vers la page en cours, chacun avec un autre paramètre de requête.J'ai besoin de garder chaîne de requête intact, et ajouter (ou modifier la valeur d' ) une requête supplémentaire de l'élément (par exemple.la "page"):

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

etc.

Est-il une simple méthode d'aide que je peux utiliser dans la méthode Render ...uhmm ...comme:

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

Qui prendra soin de générer une URL correcte, de maintenir la chaîne de requête les éléments et ne pas créer de doublons, par exemple.page=1&page=2&page=3?

Laminage à mon propre semble comme une tâche désagréable.

Était-ce utile?

La solution

Je crains que je ne connais pas de méthode intégrée pour cela, nous utilisons cette méthode qui prend la chaîne de requête et définit les paramètres

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

Évidemment, vous pouvez utiliser la chaîne de Requête NameValueCollection propriété de l'URI de l'objet pour faire de la recherche de la valeurs plus facile, mais nous voulions être en mesure d'analyser toute la chaîne de recherche.

Autres conseils

Oh, et nous avons cette méthode trop qui vous permet de vous mettre dans l'ensemble de la chaîne d'URL sans avoir à obtenir l'querystring hors de lui

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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top