Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果没有请求,则添加查询字符串_C#_Asp.net_Query String - Fatal编程技术网

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

C# 如果没有请求,则添加查询字符串,c#,asp.net,query-string,C#,Asp.net,Query String,我没有请求,我只有一个url字符串。此外,url可以是相对的,也可以是绝对的。由于和不支持相对URL,我可能不得不手动执行,除非有我不知道的技巧。在我的项目中,这种方法将被用于可能超过1000行的代码中,这就是为什么我希望正确地执行它 如果传递了相对url,则以下代码将中断: public static string AddQueryStringIfNotExists(string url, string parameter, string value) { var uriBuilder

我没有
请求
,我只有一个url字符串。此外,url可以是相对的,也可以是绝对的。由于和不支持相对URL,我可能不得不手动执行,除非有我不知道的技巧。在我的项目中,这种方法将被用于可能超过1000行的代码中,这就是为什么我希望正确地执行它

如果传递了相对url,则以下代码将中断:

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();
}

另外,我可以通过检查我的参数是否出现在第一个
之后来手动执行此操作,但这需要处理几个边缘情况,我试图避免的事情(如另一个参数中包含的参数名称)

可以有一个简单的帮助器,它将相对URL转换为绝对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);

只要检查你的url是绝对的。如果不是,请将其转换为绝对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/mypage/html?something=1&somethingelse=1

我想避免使用绝对url,因为我最终将在
Response.Redirect中使用输出,它会自动处理相对url。此外,每当我有一个需要对我的项目进行完整扫描的相对URL时,我都必须有选择地传递域。如果它是相对的,则将其转换为绝对的,附加查询,然后返回URL的相对部分。否则就按你现在的方式处理。