Могу ли я изменить переменные Request.Form?

Я пытаюсь Request.Form.Set(k, v) но это исключение

Коллекция доступна только для чтения

Ответ 1

Это точно так же, как изменение 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

Ответ 2

Форма представляет собой представление того, что клиент отправил в запросе. Что вы хотите сделать? Лично я попытался бы отделить код "читать форму" от кода "сделать что-то со значениями" - таким образом, вы можете выполнить предварительную обработку на ранней стадии (при чтении из формы), и ни один из последующих код должен знать о том, что действительно было отправлено - он просто принимает значения, данные ему (т.е. он никогда не говорит напрямую с запросом).

Если вы также можете протестировать свою логику без необходимости в форме или даже http-запросе вообще.

Собственно, ASP.NET MVC будет делать много этого (выше) для вас...

Обратите внимание, что вы можете обновить коллекцию .Items, но это немного более смутно (т.е. не относится конкретно к форме).

(приветствия для исправления опечатки btw)