2008-09-06 3 views
3

Я реализую пользовательский элемент управления и в этом элементе управления мне нужно написать кучу ссылок на текущую страницу, каждая из которых имеет другой параметр запроса. Мне нужно, чтобы сохранить существующую строку запроса нетронутыми, и добавить (или изменить значение) дополнительный элемент запроса (например, «страница».):UserControl rendering: напишите ссылку на текущую страницу?

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

т.д.

Есть простой вспомогательный метод, который Я могу использовать в методе рендер ... гммм ... как:

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

Это будет заботиться о создании правильного URL, сохранить существующие строки запроса элементов, а не создавать дубликаты например. страница = 1 & страница = 2 & страница = 3?

Подвижность моей собственной кажется такой непривлекательной задачей.

ответ

1

Я боюсь, что я не знаю ни одного встроенного метода для этого, мы используем этот метод, который принимает строку запроса и задает параметры

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

Очевидно, что вы могли бы использовать свойство объекта QueryString NameValueCollection URI, чтобы упростить поиск значений, но мы хотели иметь возможность анализировать любые запросы.

0

О, и у нас есть этот метод тоже, что позволяет поместить в целой строки URL, не имея, чтобы получить строку запроса из него

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