2017-07-17 33 views
1

我没有Request,我只有一个url字符串。此外,该网址可以是相对或绝对的。而且由于UriUriBuilder不支持相关网址,因此我可能必须手动执行此操作,除非有一个我不知道的技巧。这个方法在我的项目中可能会用到一千多行代码,这就是为什么我想正确地做到这一点。添加查询字符串如果不存在请求

下面的代码将打破,如果一个相对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(); 
} 

附:我很好,通过检查我的参数是否出现在第一个?后面,但是这需要处理几个边缘情况,我试图避免的情况(如参数名称包含在另一个参数中)

回答

1

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

然后使用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

1

There可以是一个简单的帮手,将相对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); 
+0

我想避免的绝对URL,因为我最终会使用'Response.Redirect'中的输出来自动处理相对的URL。此外,每当我有一个相对URL需要全面扫描我的项目时,我必须有选择地通过域。 – yazanpro

+0

如果它是相对的,然后将其转换为绝对,追加您的查询,然后返回相对部分的网址。否则按照你的方式处理它。 –

相关问题