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

Я попробую Request.Form.Set(k, v) но это исключение

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

2 ответа

Решение

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

План Б, который, как мне кажется, лучше подходит для модульного тестирования, состоит в том, чтобы избегать непосредственного обращения к коллекции и вместо этого передавать ее как NameValueCollection к любому методу, который вы хотите обработать, поверхностное копирование всего, что вам нужно. Я сам использовал это, чтобы высмеивать веб-запросы.

Изменить: Марк Гравелл дал более красноречивые причины для плана B

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

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

На самом деле ASP.NET MVC сделает многое из этого (вышеприведенный абзац) для вас...

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

(ура за исправление опечатки между прочим)

Другие вопросы по тегам