Я пытаюсь Request.Form.Set(k, v)
но это исключение
Коллекция доступна только для чтения
Я пытаюсь Request.Form.Set(k, v)
но это исключение
Коллекция доступна только для чтения
Это точно так же, как изменение 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
Форма представляет собой представление того, что клиент отправил в запросе. Что вы хотите сделать? Лично я попытался бы отделить код "читать форму" от кода "сделать что-то со значениями" - таким образом, вы можете выполнить предварительную обработку на ранней стадии (при чтении из формы), и ни один из последующих код должен знать о том, что действительно было отправлено - он просто принимает значения, данные ему (т.е. он никогда не говорит напрямую с запросом).
Если вы также можете протестировать свою логику без необходимости в форме или даже http-запросе вообще.
Собственно, ASP.NET MVC будет делать много этого (выше) для вас...
Обратите внимание, что вы можете обновить коллекцию .Items, но это немного более смутно (т.е. не относится конкретно к форме).
(приветствия для исправления опечатки btw)