查询字符串 - 在c#中向查询字符串添加值

6

如何向查询字符串添加值?

我正在尝试实现以下功能:

String currurl = HttpContext.Current.Request.RawUrl;
var querystring = HttpContext.Current.Request.QueryString.ToString();

var PrintURL = currurl + (String.IsNullOrEmpty(querystring)) ?
    HttpContext.Current.Request.QueryString.Add("print", "y") : string.Empty;

但是我一直收到这个错误:

无法将类型“string”隐式转换为“bool”

我只是想获取当前URL并在查询字符串中添加?print=y。

6个回答

10

好的,第一个问题可以使用下面的方法解决:

var PrintURL = currurl + (String.IsNullOrEmpty(querystring) ? 
   HttpContext.Current.Request.QueryString.Add("print", "y") : string.Empty);
你的原始代码只是将括号从 (String.IsNullOrEmpty(querystring)) (它是不必要的位置)移动到 ?: 子句的末尾。这样可以明确表达你的意图。
否则,编译器会试图将 String.IsNullOrEmpty(querystring) 的结果(一个 bool)与 currUrl 进行连接 -- 这是不正确的,并且不是你最初想要的结果。
但是,HttpContext.Current.Request.QueryString.Add("print", "y") 语句有第二个问题。它返回的是 void,不是 string。你需要修改三元表达式中的这部分内容,以便它返回一个字符串。你想要做什么?

1
正确,但你需要解释为什么。 - SLaks
@Donut HttpContext.Current.Request.QueryString 不是只读的吗? - Magnus
@Donut: 正如之前提到的,这个会失败,因为Request.QueryString.Add()不返回任何东西(void)。 - Nimrod
@Magnus 是的。不确定 OP 希望该表达式返回什么;似乎他只是想连接另一个字符串,但是一些澄清会很好。 - Donut
我尝试了这个代码:var currurl = HttpContext.Current.Request.RawUrl; var querystring = HttpContext.Current.Request.QueryString;var PrintURL = currurl + (String.IsNullOrEmpty(querystring) ? HttpContext.Current.Request.QueryString.Add("print", "y") : string.Empty);但是我仍然得到错误:'string.IsNullOrEmpty(string)'的最佳重载方法有一些无效的参数。 - ShaneKm
@Shane Km 这是因为在你的评论中,querystring 不是一个字符串 -- 它是一个 NameValueCollection。如果你想确定这个集合是否为空,你可以检查它的 Count 属性 - Donut

5

HttpContext.Current.Request.QueryString.Add("print", "y") 返回的是void类型,而不是string类型,因此你不能在三元表达式中使用该调用。另外,在请求的查询字符串中添加内容不会影响HTTPResponse,我想你想要做的是更新查询字符串并重定向浏览器加载新的URL。你需要构造新的URL,并使用response.redirect来实现。


10
HttpContext.Current.Request.QueryString是只读的,因此HttpContext.Current.Request.QueryString.Add("print", "y")会引发异常。 - Anthony

3
我已理解。
String currurl = HttpContext.Current.Request.Url.ToString();
String querystring = null;

// Check to make sure some query string variables
// exist and if not add some and redirect.
int iqs = currurl.IndexOf('?');
if (iqs == -1)
{
    String redirecturl = currurl + "?print=y";
}

不确定这是否是最简单的方法,但它可以解决问题。 感谢大家的帮助。


String url = HttpContext.Current.Request.Url.ToString(); url += url.IndexOf('?') == -1 ? "?print=y" : "print=y"; +1。 - user1017882

2
你尝试做的事情有几个问题。
首先,QueryString集合是一个NameValueCollection。Add方法返回void。因此,即使尝试分配QueryString.Add的结果也不会起作用。
其次,你不能修改QueryString集合,它是只读的。在Velocity Reviews上有一个响应,讨论了你要尝试做的事情。你应该使用新值重定向用户,而不是尝试修改查询字符串。

1
currurl + (String.IsNullOrEmpty(querystring)

必须返回一个布尔值,因此条件必须不同。


1

首先的问题是你需要在使用?的语句周围加上括号:

var PrintURL = currurl + ((String.IsNullOrEmpty(querystring)) ? HttpContext.Current.Request.QueryString.Add("print", "y") : string.Empty);

下一个问题是HttpContext.Current.Request.QueryString.Add没有返回任何内容,因此:的一侧返回void,而另一侧返回空字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接