我尝试使用
Request.Form.Set(k, v)
方法,但它抛出异常。
集合是只读的。
这与修改 Request.Querystring
的操作完全相同。两者都包含了私有属性和一个可能被认为是bug的内部复杂结构,但我知道两种可能的解决方案(我会立刻排除response.redirect计划 - 那太糟糕了)。
方法一是使用反射直接修改集合:
NameValueCollection oQuery = Request.QueryString;
oQuery = (NameValueCollection)Request.GetType().GetField("_queryString",BindingFlags.NonPublic | BindingFlags.Instance).GetValue(Request);
PropertyInfo oReadable = oQuery .GetType().GetProperty("IsReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
oReadable.SetValue(oQuery, false, null);
oQuery["foo"] = "bar";
oReadable.SetValue(oQuery, true, null);
我认为更适合单元测试的备选方案是计划B,它避免直接处理集合,而是将其作为NameValueCollection
传递给任何要处理它的方法,并浅复制你所需要的内容。我自己使用这种方法来模拟Web请求。
编辑:Marc Gravell提供了更为优美的计划B理由。