C#我可以修改Request.Form的变量吗?

我尝试Request.Form.Set(k,v)但它的抛出exceptionCollection是只读的

这与修改Request.Querystring完全相同。 两者都是内部复杂的私人财产和什么可能被视为一个错误,但我知道有两种可能的解决方案(我将解雇响应。直接计划失控 – 这太可怕了)。

方法一是使用reflection直接修改集合:

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,我认为它更适合unit testing,是为了避免直接处理集合,而是将它作为NameValueCollection传递给你想要处理它的任何方法,浅层复制你需要的任何东西。 我自己用它来模拟Web请求。

编辑:Marc Gravell为计划B提供了更有说服力的理由

表单表示客户端在请求中发送的内容。 你想做什么? 就个人而言,我会尝试将“读取表单”代码与“使用值进行处理”代码分开 – 这样,您可以在早期(从表单中读取时)进行任何预处理,而不是后者代码需要知道实际发送的内容 – 它只需要赋予它的值(即它永远不会直接与请求对话)。

如果还意味着您可以测试您的逻辑而无需表单,甚至根本不需要http请求。

实际上,ASP.NET MVC会为你做很多这个(上段)…

请注意,您可以更新.Items集合 – 但这有点模糊(即它与表单没有特别关系)。

(为打破拼写错误而欢呼)