Это точно так же, как изменение Request.Querystring
. Оба внутренне усложняются частными свойствами и тем, что может считаться ошибкой, однако есть два возможных решения, о которых я знаю (я отклоню план 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
любому методу, который вы хотите обработать, избегая поверхностного копирования всего, что вам нужно. Я сам использовал это, чтобы высмеивать веб-запросы.
Редактировать: Марк Гравелл дал более красноречивые причины для плана B