Получить параметры url из строки в .NET.
У меня есть строка в .NET, которая на самом деле является URL-адресом. Мне нужен простой способ получить значение из определенного параметра.
Обычно я просто использую Request.Params["theThingIWant"]
, но эта строка не из запроса. Я могу создать новый элемент Uri
, например:
Uri myUri = new Uri(TheStringUrlIWantMyValueFrom);
Я могу использовать myUri.Query
, чтобы получить строку запроса... но тогда я, видимо, должен найти некоторый regexy способ ее расщепления.
Я пропустил что-то очевидное или нет встроенного способа сделать это, не создавая какого-либо регулярного выражения и т.д.
Ответы
Ответ 1
Использовать статический метод ParseQueryString
класса System.Web.HttpUtility
, который возвращает NameValueCollection
.
Uri myUri = new Uri("http://www.example.com?param1=good¶m2=bad");
string param1 = HttpUtility.ParseQueryString(myUri.Query).Get("param1");
Проверить документацию на http://msdn.microsoft.com/en-us/library/ms150046.aspx
Ответ 2
Это, вероятно, то, что вы хотите
var uri = new Uri("http://domain.test/Default.aspx?var1=true&var2=test&var3=3");
var query = HttpUtility.ParseQueryString(uri.Query);
var var2 = query.Get("var2");
Ответ 3
Здесь другая альтернатива, если по какой-либо причине вы не можете или не хотите использовать HttpUtility.ParseQueryString()
.
Это построено так, чтобы быть несколько терпимым к "искаженным" строкам запроса, т.е. http://test/test.html?empty=
становится параметром с пустым значением. Вызывающий может проверить параметры, если это необходимо.
public static class UriHelper
{
public static Dictionary<string, string> DecodeQueryParameters(this Uri uri)
{
if (uri == null)
throw new ArgumentNullException("uri");
if (uri.Query.Length == 0)
return new Dictionary<string, string>();
return uri.Query.TrimStart('?')
.Split(new[] { '&', ';' }, StringSplitOptions.RemoveEmptyEntries)
.Select(parameter => parameter.Split(new[] { '=' }, StringSplitOptions.RemoveEmptyEntries))
.GroupBy(parts => parts[0],
parts => parts.Length > 2 ? string.Join("=", parts, 1, parts.Length - 1) : (parts.Length > 1 ? parts[1] : ""))
.ToDictionary(grouping => grouping.Key,
grouping => string.Join(",", grouping));
}
}
Test
[TestClass]
public class UriHelperTest
{
[TestMethod]
public void DecodeQueryParameters()
{
DecodeQueryParametersTest("http://test/test.html", new Dictionary<string, string>());
DecodeQueryParametersTest("http://test/test.html?", new Dictionary<string, string>());
DecodeQueryParametersTest("http://test/test.html?key=bla/blub.xml", new Dictionary<string, string> { { "key", "bla/blub.xml" } });
DecodeQueryParametersTest("http://test/test.html?eins=1&zwei=2", new Dictionary<string, string> { { "eins", "1" }, { "zwei", "2" } });
DecodeQueryParametersTest("http://test/test.html?empty", new Dictionary<string, string> { { "empty", "" } });
DecodeQueryParametersTest("http://test/test.html?empty=", new Dictionary<string, string> { { "empty", "" } });
DecodeQueryParametersTest("http://test/test.html?key=1&", new Dictionary<string, string> { { "key", "1" } });
DecodeQueryParametersTest("http://test/test.html?key=value?&b=c", new Dictionary<string, string> { { "key", "value?" }, { "b", "c" } });
DecodeQueryParametersTest("http://test/test.html?key=value=what", new Dictionary<string, string> { { "key", "value=what" } });
DecodeQueryParametersTest("http://www.google.com/search?q=energy+edge&rls=com.microsoft:en-au&ie=UTF-8&oe=UTF-8&startIndex=&startPage=1%22",
new Dictionary<string, string>
{
{ "q", "energy+edge" },
{ "rls", "com.microsoft:en-au" },
{ "ie", "UTF-8" },
{ "oe", "UTF-8" },
{ "startIndex", "" },
{ "startPage", "1%22" },
});
DecodeQueryParametersTest("http://test/test.html?key=value;key=anotherValue", new Dictionary<string, string> { { "key", "value,anotherValue" } });
}
private static void DecodeQueryParametersTest(string uri, Dictionary<string, string> expected)
{
Dictionary<string, string> parameters = new Uri(uri).DecodeQueryParameters();
Assert.AreEqual(expected.Count, parameters.Count, "Wrong parameter count. Uri: {0}", uri);
foreach (var key in expected.Keys)
{
Assert.IsTrue(parameters.ContainsKey(key), "Missing parameter key {0}. Uri: {1}", key, uri);
Assert.AreEqual(expected[key], parameters[key], "Wrong parameter value for {0}. Uri: {1}", parameters[key], uri);
}
}
}
Ответ 4
Похоже, вы должны перебирать значения myUri.Query
и анализировать его оттуда.
string desiredValue;
foreach(string item in myUri.Query.Split('&'))
{
string[] parts = item.Replace('?', '').Split('=');
if(parts[0] == "desiredKey")
{
desiredValue = parts[1];
break;
}
}
Я бы не использовал этот код, не тестируя его на связке некорректных URL. Это может нарушить некоторые из них:
-
hello.html?
-
hello.html?valuelesskey
-
hello.html?key=value=hi
-
hello.html?hi=value?&b=c
- и т.д.
Ответ 5
@Andrew и @CZFox
У меня была такая же ошибка, и я обнаружил, что причиной этого является тот, что есть на самом деле: http://www.example.com?param1
а не param1
, что и следовало ожидать.
Удаляя все символы до и включая вопросительный знак, эта проблема устраняется. Поэтому по существу функция HttpUtility.ParseQueryString
требует только допустимого параметра строки запроса, содержащего только символы после вопросительного знака, как в:
HttpUtility.ParseQueryString ( "param1=good¶m2=bad" )
Мое обходное решение:
string RawUrl = "http://www.example.com?param1=good¶m2=bad";
int index = RawUrl.IndexOf ( "?" );
if ( index > 0 )
RawUrl = RawUrl.Substring ( index ).Remove ( 0, 1 );
Uri myUri = new Uri( RawUrl, UriKind.RelativeOrAbsolute);
string param1 = HttpUtility.ParseQueryString( myUri.Query ).Get( "param1" );`
Ответ 6
Используйте .NET Reflector для просмотра метода FillFromString
System.Web.HttpValueCollection
. Это дает вам код, который ASP.NET использует для заполнения коллекции Request.QueryString
.
Ответ 7
Вы можете использовать следующее обходное решение для работы с первым параметром:
var param1 =
HttpUtility.ParseQueryString(url.Substring(
new []{0, url.IndexOf('?')}.Max()
)).Get("param1");
Ответ 8
HttpContext.Current.Request.QueryString.Get("id");
Ответ 9
Или, если вы не знаете URL-адрес (чтобы избежать жесткого кодирования, используйте AbsoluteUri
Пример...
//get the full URL
Uri myUri = new Uri(Request.Url.AbsoluteUri);
//get any parameters
string strStatus = HttpUtility.ParseQueryString(myUri.Query).Get("status");
string strMsg = HttpUtility.ParseQueryString(myUri.Query).Get("message");
switch (strStatus.ToUpper())
{
case "OK":
webMessageBox.Show("EMAILS SENT!");
break;
case "ER":
webMessageBox.Show("EMAILS SENT, BUT ... " + strMsg);
break;
}
Ответ 10
если вы хотите получить свою страницу QueryString по умолчанию. Страница "Дефект" означает ваш текущий URL-адрес страницы.
вы можете попробовать этот код:
string paramIl = HttpUtility.ParseQueryString(this.ClientQueryString).Get("city");
Ответ 11
Это на самом деле очень просто, и это сработало для меня :)
if (id == "DK")
{
string longurl = "selectServer.aspx?country=";
var uriBuilder = new UriBuilder(longurl);
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
query["country"] = "DK";
uriBuilder.Query = query.ToString();
longurl = uriBuilder.ToString();
}
Ответ 12
Для тех, кто хочет перебрать все строки запроса из строки
foreach (var item in new Uri(urlString).Query.TrimStart('?').Split('&'))
{
var subStrings = item.Split('=');
var key = subStrings[0];
var value = subStrings[1];
// do something with values
}
Ответ 13
Я использовал его, и он отлично работал
<%=Request.QueryString["id"] %>