Как заменить url-параметр? - PullRequest
7 голосов
/ 07 апреля 2011

указан URL-адрес типа http://localhost:1973/Services.aspx?idProject=10&idService=14.

Какой самый простой способ заменить оба значения url-параметра (например, от 10 до 12 и от 14 до 7)?

Regex, String.Replace, Substring или LinQ - я немного застрял.

Заранее спасибо,

Тим


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

string newUrl = url.Replace(url.Substring(url.IndexOf("Services.aspx?") + "Services.aspx?".Length), string.Format("idProject={0}&idService={1}", Services.IdProject, Services.IdService));

Но спасибо за ваши предложения:)

Ответы [ 8 ]

14 голосов
/ 13 сентября 2012

Вот что я бы сделал:

public static class UrlExtensions
{
    public static string SetUrlParameter(this string url, string paramName, string value)
    {
        return new Uri(url).SetParameter(paramName, value).ToString();
    }

    public static Uri SetParameter(this Uri url, string paramName, string value)
    {           
        var queryParts = HttpUtility.ParseQueryString(url.Query);
        queryParts[paramName] = value;
        return new Uri(url.AbsoluteUriExcludingQuery() + '?' + queryParts.ToString());
    }

    public static string AbsoluteUriExcludingQuery(this Uri url)
    {
        return url.AbsoluteUri.Split('?').FirstOrDefault() ?? String.Empty;
    }
}

Использование:

string oldUrl = "http://localhost:1973/Services.aspx?idProject=10&idService=14";
string newUrl = oldUrl.SetUrlParameter("idProject", "12").SetUrlParameter("idService", "7");

Или:

Uri oldUrl = new Uri("http://localhost:1973/Services.aspx?idProject=10&idService=14");
Uri newUrl = oldUrl.SetParameter("idProject", "12").SetParameter("idService", "7");
8 голосов
/ 07 апреля 2011

утилита C # HttpUtility.ParseQueryString сделает всю тяжелую работу за вас. Вы захотите сделать более надежную проверку нуля в вашей окончательной версии.

    // Let the object fill itself 
    // with the parameters of the current page.
    var qs = System.Web.HttpUtility.ParseQueryString(Request.RawUrl);

    // Read a parameter from the QueryString object.
    string value1 = qs["name1"];

    // Write a value into the QueryString object.
    qs["name1"] = "This is a value";
6 голосов
/ 27 января 2015

Вот моя реализация:

using System;
using System.Collections.Specialized;
using System.Web; // For this you need to reference System.Web assembly from the GAC

public static class UriExtensions
{
    public static Uri SetQueryVal(this Uri uri, string name, object value)
    {
        NameValueCollection nvc = HttpUtility.ParseQueryString(uri.Query);
        nvc[name] = (value ?? "").ToString();
        return new UriBuilder(uri) {Query = nvc.ToString()}.Uri;
    }
}

и вот несколько примеров:

new Uri("http://host.com/path").SetQueryVal("par", "val")
// http://host.com/path?par=val

new Uri("http://host.com/path?other=val").SetQueryVal("par", "val")
// http://host.com/path?other=val&par=val

new Uri("http://host.com/path?PAR=old").SetQueryVal("par", "new")
// http://host.com/path?PAR=new

new Uri("http://host.com/path").SetQueryVal("par", "/")
// http://host.com/path?par=%2f

new Uri("http://host.com/path")
    .SetQueryVal("p1", "v1")
    .SetQueryVal("p2", "v2")
// http://host.com/path?p1=v1&p2=v2
2 голосов
/ 03 июня 2016

Я недавно выпустил UriBuilderExtended , библиотеку, которая делает редактирование строк запросов на UriBuilder объектах быстрым с помощью методов расширения.

Вы просто создаете UriBuilderОбъект с вашей текущей строкой URL в конструкторе, измените запрос с помощью методов расширения и создайте новую строку URL из UriBuilder объекта.

Быстрый пример:

string myUrl = "http://www.example.com/?idProject=10&idService=14";

UriBuilder builder = new UriBuilder(myUrl);

builder.SetQuery("idProject", "12");
builder.SetQuery("idService", "7");

string newUrl = builder.Url.ToString();

URLСтрока получается из builder.Uri.ToString(), а не builder.ToString(), поскольку иногда она отображается иначе, чем вы ожидаете.

Вы можете получить библиотеку через NuGet .

Больше примеров здесь .

Комментарии и пожелания приветствуются.

2 голосов
/ 07 апреля 2011

Я нашел это в старом примере кода, не потребовалось бы много времени для его улучшения, принимая IEnumerable<KeyValuePair<string,object>>, может быть лучше, чем текущая разделенная строка.

    public static string AppendQuerystring( string keyvalue)
    {
        return AppendQuerystring(System.Web.HttpContext.Current.Request.RawUrl, keyvalue);
    }
    public static string AppendQuerystring(string url, string keyvalue)
    {
        string dummyHost = "http://www.test.com:80/";
        if (!url.ToLower().StartsWith("http"))
        {
            url = String.Concat(dummyHost, url);
        }
        UriBuilder builder = new UriBuilder(url);
        string query = builder.Query;
        var qs = HttpUtility.ParseQueryString(query);
        string[] pts = keyvalue.Split('&');
        foreach (string p in pts)
        {
            string[] pts2 = p.Split('=');
            qs.Set(pts2[0], pts2[1]);
        }
        StringBuilder sb = new StringBuilder();

        foreach (string key in qs.Keys)
        {
            sb.Append(String.Format("{0}={1}&", key, qs[key]));
        }
        builder.Query = sb.ToString().TrimEnd('&');
        string ret = builder.ToString().Replace(dummyHost,String.Empty);
        return ret;
    }

Использование

   var url = AppendQueryString("http://localhost:1973/Services.aspx?idProject=10&idService=14","idProject=12&idService=17");
2 голосов
/ 07 апреля 2011

Самый простой способ - String.Replace, но у вас возникнут проблемы, если ваш URI будет выглядеть как http://localhost:1212/base.axd?id=12&otherId=12

1 голос
/ 07 апреля 2011

Самый надежный способ - использовать класс Uri для анализа строки, изменения значений параметров, а затем для построения результата.

Существует множество нюансов работы URL-адресов, и хотя вы можете попытаться применить собственное регулярное выражение для этого, это может быстро усложнить обработку всех случаев.

У всех других методов могут возникнуть проблемы с соответствием подстрок и т. Д., И я даже не вижу, как здесь применяется Linq.

0 голосов
/ 02 ноября 2013

У меня та же проблема, и я решил ее с помощью следующих трех строк кода, которые я получаю из комментариев здесь (например, решение Стивена Оберауэра, но менее переоценено):

    ' EXAMPLE: 
    '    INPUT:  /MyUrl.aspx?IdCat=5&Page=3
    '    OUTPUT: /MyUrl.aspx?IdCat=5&Page=4
    ' Get the URL and breaks each param into Key/value collection: 
    Dim Col As NameValueCollection = System.Web.HttpUtility.ParseQueryString(Request.RawUrl)

    ' Changes the param you want in the url, with the value you want
    Col.Item("Page") = "4"

    ' Generates the output string with the result (it also includes the name of the page, not only the params )
    Dim ChangedURL As String = HttpUtility.UrlDecode(Col.ToString())

Это решениеиспользуя VB .NET, но преобразование в C # просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...