.NET:从字符串中获取url参数

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (9)
  • 关注 (0)
  • 查看 (648)

我在.NET中有一个字符串,它实际上是一个URL。我希望有一种从特定参数中获取值的简单方法。

通常,我会用Request.Params["theThingIWant"],但是这个字符串不是来自请求。我可以创造一个新的Uri项目如下:

Uri myUri = new Uri(TheStringUrlIWantMyValueFrom);

我可以用myUri.Query要得到查询字符串...但显然我必须找到一些重新定义的方法来分割它。

我是不是遗漏了一些显而易见的东西,或者说,除了创建某种正则表达式之外,没有任何方法可以做到这一点,等等?

提问于
用户回答回答于

如果您想要加入,请在默认页面上获取QueryString。默认页面意味着您当前的页面url。您可以尝试以下代码:

string paramIl = HttpUtility.ParseQueryString(this.ClientQueryString).Get("city");
用户回答回答于

或者如果您不知道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;
        }
用户回答回答于
HttpContext.Current.Request.QueryString.Get("id");
用户回答回答于

使用.NET反射器查看FillFromString方法System.Web.HttpValueCollection这给了你ASP的代码.NET用于填充Request.QueryString收藏。

用户回答回答于

您也可以使用以下方法来处理第一个参数:

var param1 =
    HttpUtility.ParseQueryString(url.Substring(
        new []{0, url.IndexOf('?')}.Max()
    )).Get("param1");
用户回答回答于

@Andrew和CZFox

我也有同样的错误,并发现原因是参数之一实际上是:http://www.example.com?param1而不是param1这正是人们所期望的。

通过删除前面的所有字符并包括问号,可以解决此问题。所以本质上HttpUtility.ParseQueryString函数只需要一个有效的查询字符串参数,该参数仅包含问号后面的字符,如下所示:

HttpUtility.ParseQueryString ( "param1=good&param2=bad" )

我的解决办法:

string RawUrl = "http://www.example.com?param1=good&param2=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" );`
用户回答回答于

这里还有另一种选择,如果出于任何原因,你不能或不想使用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));
    }
}

试验

[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);
        }
    }
}
用户回答回答于

这可能是你想要的

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");
用户回答回答于

使用静态ParseQueryString方法System.Web.HttpUtility类返回的NameValueCollection...

Uri myUri = new Uri("http://www.example.com?param1=good&param2=bad");
string param1 = HttpUtility.ParseQueryString(myUri.Query).Get("param1");

查阅文件http://msdn.microsoft.com/en-us/Library/ms150046.aspx

扫码关注云+社区

领取腾讯云代金券