C# 从 .NET 中的字符串获取 url 参数
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/659887/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Get url parameters from a string in .NET
提问by Beska
I've got a string in .NET which is actually a url. I want an easy way to get the value from a particular parameter.
我在 .NET 中有一个字符串,它实际上是一个 url。我想要一种从特定参数获取值的简单方法。
Normally, I'd just use Request.Params["theThingIWant"]
, but this string isn't from the request. I can create a new Uri
item like so:
通常,我只使用Request.Params["theThingIWant"]
,但此字符串不是来自请求。我可以Uri
像这样创建一个新项目:
Uri myUri = new Uri(TheStringUrlIWantMyValueFrom);
I can use myUri.Query
to get the query string...but then I apparently have to find some regexy way of splitting it up.
我可以myUri.Query
用来获取查询字符串……但是我显然必须找到一些正则表达式来拆分它。
Am I missing something obvious, or is there no built in way to do this short of creating a regex of some kind, etc?
我是否遗漏了一些明显的东西,或者除了创建某种正则表达式之外,是否没有内置的方法来做到这一点?
采纳答案by CZFox
Use static ParseQueryString
method of System.Web.HttpUtility
class that returns NameValueCollection
.
使用返回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");
Check documentation at http://msdn.microsoft.com/en-us/library/ms150046.aspx
回答by Tom Ritter
Looks like you should loop over the values of myUri.Query
and parse it from there.
看起来您应该遍历的值myUri.Query
并从那里解析它。
string desiredValue;
foreach(string item in myUri.Query.Split('&'))
{
string[] parts = item.Replace("?", "").Split('=');
if(parts[0] == "desiredKey")
{
desiredValue = parts[1];
break;
}
}
I wouldn't use this code without testing it on a bunch of malformed URLs however. It might break on some/all of these:
但是,如果没有在一堆格式错误的 URL 上对其进行测试,我不会使用此代码。它可能会破坏其中的一些/所有:
hello.html?
hello.html?valuelesskey
hello.html?key=value=hi
hello.html?hi=value?&b=c
- etc
hello.html?
hello.html?valuelesskey
hello.html?key=value=hi
hello.html?hi=value?&b=c
- 等等
回答by David
Use .NET Reflector to view the FillFromString
method of System.Web.HttpValueCollection
. That gives you the code that ASP.NET is using to fill the Request.QueryString
collection.
使用.NET反射来观看FillFromString
的方法System.Web.HttpValueCollection
。这为您提供了 ASP.NET 用于填充Request.QueryString
集合的代码。
回答by Sergej Andrejev
This is probably what you want
这可能就是你想要的
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");
回答by Mo Gauvin
@Andrew and @CZFox
@Andrew 和 @CZFox
I had the same bug and found the cause to be that parameter one is in fact: http://www.example.com?param1
and not param1
which is what one would expect.
我有同样的错误,发现原因是该参数实际上是:http://www.example.com?param1
而不是param1
人们所期望的。
By removing all characters before and including the question mark fixes this problem. So in essence the HttpUtility.ParseQueryString
function only requires a valid query string parameter containing only characters after the question mark as in:
通过删除前面的所有字符并包括问号来解决这个问题。所以本质上,该HttpUtility.ParseQueryString
函数只需要一个有效的查询字符串参数,只包含问号后的字符,如下所示:
HttpUtility.ParseQueryString ( "param1=good¶m2=bad" )
My workaround:
我的解决方法:
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" );`
回答by tomsv
You can use the following workaround for it to work with the first parameter too:
您也可以使用以下解决方法来处理第一个参数:
var param1 =
HttpUtility.ParseQueryString(url.Substring(
new []{0, url.IndexOf('?')}.Max()
)).Get("param1");
回答by alsed42
Here's another alternative if, for any reason, you can't or don't want to use HttpUtility.ParseQueryString()
.
如果出于任何原因,您不能或不想使用HttpUtility.ParseQueryString()
.
This is built to be somewhat tolerant to "malformed" query strings, i.e. http://test/test.html?empty=
becomes a parameter with an empty value. The caller can verify the parameters if needed.
这是为了在某种程度上容忍“格式错误”的查询字符串,即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);
}
}
}
回答by Erhan Demirci
if you want in get your QueryString on Default page .Default page means your current page url . you can try this code :
如果你想在默认页面上获取你的 QueryString 。默认页面意味着你当前的页面 url 。你可以试试这个代码:
string paramIl = HttpUtility.ParseQueryString(this.ClientQueryString).Get("city");
回答by Hallgeir Engen
HttpContext.Current.Request.QueryString.Get("id");
回答by Fandango68
Or if you don't know the URL (so as to avoid hardcoding, use the AbsoluteUri
或者,如果您不知道 URL(为了避免硬编码,请使用 AbsoluteUri
Example ...
例子 ...
//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;
}