Pregunta

No soy bueno con Regex y no puedo encontrar una solución aplicable, por lo que después de una buena cantidad de búsqueda, todavía no puedo clavar esto.

Tengo una URL con una página opcional = 123 parámetro. También puede haber otros parámetros GET opcionales en la URL que pueden ocurrir antes o después del parámetro de página.

Necesito reemplazar ese parámetro a página =-marcador de posición-para poder usarlo con mi función de paginación.

Si el parámetro de la página no ocurre en la URL, me gustaría agregarlo de la manera descrita anteriormente.

Estoy tratando de escribir un método de extensión para la cadena para esto, pero una función estática sería igual de buena.

También se agradecería un poco de explicación, ya que me daría una buena lección en regex y espero que la próxima vez no tenga que preguntar.

También estoy usando ASP.NET MVC-3, pero por razones de compatibilidad de compatibilidad ocurre antes del enrutamiento MVC-S, y no puedo acceder a eso. Así que por favor no me aconsejes que use el enrutamiento MVC-S para esto porque no puedo.

¿Fue útil?

Solución

Sugiero omitir el regex y usar otro enfoque:

  1. Extraiga la consulta de la URL.
  2. Construir un HttpValueCollection de la consulta usando HttpUtility.ParseQueryString
  3. Reemplace el parámetro de la página en la colección.
  4. Llamar .ToString() en la colección y obtienes una nueva consulta.
  5. Construya la URL alterada utilizando el original menos la vieja Querystring más la nueva.

Algo como:

public static string SetPageParameter(this string url, int pageNumber)
{
    var queryStartIndex = url.IndexOf("?") + 1;
    if (queryStartIndex == 0)
    {
        return string.Format("{0}?page={1}", url, pageNumber);
    }
    var oldQueryString = url.Substring(queryStartIndex);
    var queryParameters = HttpUtility.ParseQueryString(oldQueryString);
    queryParameters["page"] = pageNumber;
    return url.Substring(0, queryStartIndex) + queryParameters.ToString();
}

No he verificado que esto se compila, pero debería darte una idea.

Otros consejos

Lo desea como un método estático con expresión regular, aquí hay un primer estado:

public static string ChangePage(string sUrl)
{
  string sRc = string.Empty;
  const string sToReplace = "&page=--PLACEHOLDER--";

  Regex regURL = new Regex(@"^http://.*(&?page=(\d+)).*$");

  Match mPage =  regURL.Match(sUrl);
  if (mPage.Success) {
    GroupCollection gc = mPage.Groups;
    string sCapture = gc[1].Captures[0].Value;
    // gc[2].Captures[0].Value) is the page number
    sRc = sUrl.Replace(sCapture, sToReplace);
  }
  else {
    sRc = sUrl+sToReplace;
  }

  return sRc;
}

Con una pequeña prueba:

static void Main(string[] args)
{
  string sUrl1 = "http://localhost:22666/HtmlEdit.aspx?mid=0&page=123&test=12";
  string sUrl2 = "http://localhost:22666/HtmlEdit.aspx?mid=0&page=125612";
  string sUrl3 = "http://localhost:22666/HtmlEdit.aspx?mid=0&pager=12";
  string sUrl4 = "http://localhost:22666/HtmlEdit.aspx?page=12&mid=0";

  string sRc = string.Empty;
  sRc = ChangePage(sUrl1);
  Console.WriteLine(sRc);
  sRc = ChangePage(sUrl2);
  Console.WriteLine(sRc);
  sRc = ChangePage(sUrl3);
  Console.WriteLine(sRc);
  sRc = ChangePage(sUrl4);
  Console.WriteLine(sRc);
}

que dan el resultado:

http://localhost:22666/HtmlEdit.aspx?mid=0&page=--PLACEHOLDER--&test=12
http://localhost:22666/HtmlEdit.aspx?mid=0&page=--PLACEHOLDER--
http://localhost:22666/HtmlEdit.aspx?mid=0&pager=12&page=--PLACEHOLDER--
http://localhost:22666/HtmlEdit.aspx?&page=--PLACEHOLDER--&mid=0
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top