Могу ли я изменить переменные Request.Form? - PullRequest
12 голосов
/ 27 ноября 2008

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

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

Ответы [ 2 ]

13 голосов
/ 27 ноября 2008

Это точно так же, как изменение 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 голосов
/ 27 ноября 2008

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

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

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

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

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

...