我尝试Request.Form.Set(k, v)
,但它正在抛出异常
收集是只读的
答案 0 :(得分:13)
这与修改Request.Querystring
完全相同。两者都是内部复杂的私人财产和可能被视为错误的东西,但是我知道有两种可能的解决方案(我会忽略响应。直接计划失控 - 这很可怕)。
方法一是使用反射直接修改集合:
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提供了更有说服力的理由
答案 1 :(得分:2)
表单表示客户端在请求中发送的内容。你想做什么?就个人而言,我会尝试将“读取表单”代码与“使用值进行处理”代码分开 - 这样,您可以在早期(从表单中读取时)进行任何预处理,而不是后者代码需要知道实际发送的是什么 - 它只需要给它的值(即它永远不会直接与请求对话)。
如果还意味着您可以测试您的逻辑而无需表单,甚至根本不需要http请求。
实际上,ASP.NET MVC会为你做很多(上段)......
请注意,您可以更新.Items集合 - 但这有点模糊(即它与表单无关)。
(为解决拼写错误而欢呼)