2008-11-27 30 views

回答

12

这是完全一样的修改的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到任何你想要处理的方法,从你的任何需要的浅拷贝。我自己用它来模拟Web请求。

编辑:马克Gravell给了B计划

+1

更雄辩的理由以这种方式操纵私人的东西绝不是一个建议的事情,应该尽量避免尽可能多地(〜=不惜一切代价)。毕竟他们是有原因的私人的。你会依赖一个特定版本的库。底层实现的任何更改都可能会破坏您的应用程序。 – 2008-11-30 18:13:23

2

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

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

其实,ASP.NET MVC会为你做了很多这方面(上段)...

请注意,您可以更新.Items收集 - 但这是比较模糊一点(即它并不特别涉及表格)。

(欢呼顺便说一句固定错字)

相关问题