如果没有请求,则添加查询字符串

时间:2017-07-17 03:04:46

标签: c# asp.net query-string

我没有Request,我只有一个网址字符串。此外,URL可以是相对的也可以是绝对的。由于UriUriBuilder不支持相对网址,我可能不得不手动执行,除非有一个我不知道的技巧。这个方法可能会在我的项目中使用超过一千行代码,这就是为什么我想要做正确的。

如果传递了相对网址,以下代码将会中断:

public static string AddQueryStringIfNotExists(string url, string parameter, string value)
{
    var uriBuilder = new UriBuilder(url);
    var query = HttpUtility.ParseQueryString(uriBuilder.Query);
    if (query[parameter] == null)
    {
        query[parameter] = value;
        uriBuilder.Query = query.ToString();
    }
    return uriBuilder.ToString();
}

P.S。通过检查我的参数是否出现在第一个?之后但我需要处理几个边缘情况,我试图避免的事情(如另一个参数中包含的参数名称)< / p>

2 个答案:

答案 0 :(得分:1)

可以有一个简单的帮助器,它将相对URL转换为绝对值:

public static string ToAbsoluteUrl(this string url, string domain)
{
    var result = url.StartsWith("http", StringComparison.OrdinalIgnoreCase) ? url : domain + url;
    return result;
}

url = "/page?skip=0";
url = url.ToAbsoluteUrl("https://example.com"); // https://example.com/page?skip=0
var uriBuilder = new UriBuilder(url);

答案 1 :(得分:1)

只需检查您的网址是否绝对。如果它没有将其转换为绝对URL。

然后使用HttpUtility.ParseQueryString解析查询字符串并根据需要添加参数。

将UriBuilder转换回Uri。

如果输入是绝对的Uri则返回整个Uri。如果输入是相对的,则返回相对uri。

private static Uri dummy = new Uri("http://dummy/");
public static string AddQueryStringIfNotExists(string url, string parameter, string value)
{
    var uri = new Uri(url, UriKind.RelativeOrAbsolute);
    var uriBuilder = uri.IsAbsoluteUri ? new UriBuilder(url) : new UriBuilder(new Uri(dummy, url));

    var query = HttpUtility.ParseQueryString(uriBuilder.Query);
    if (query[parameter] == null)
    {
        query[parameter] = value;
        uriBuilder.Query = query.ToString();
    }
    return uri.IsAbsoluteUri ? uriBuilder.ToString() : dummy.MakeRelativeUri(new Uri(uriBuilder.ToString())).ToString();
}

示例:

string s = AddQueryStringIfNotExists("somedirectory/mypage/html?something=1", "somethingelse", "1");

输出:

somedirectory /我的空间/ HTML东西= 1&安培; somethingelse = 1