我尝试Request.Form.Set(k, v)
但它抛出异常
集合是只读的
annakata.. 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
任何方法传递给你想要处理它的任何方法,浅层复制你需要的任何东西.我自己用它来模拟Web请求.
编辑:Marc Gravell为计划B提供了更为雄辩的理由
这与修改完全相同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
任何方法传递给你想要处理它的任何方法,浅层复制你需要的任何东西.我自己用它来模拟Web请求.
编辑:Marc Gravell为计划B提供了更为雄辩的理由