这是在IIS 6世界中使用ASP.NET 2.0。
我有一个用户提交一个表单,该表单通过POST发送数据。接收数据的页面进行了一些简单的验证。如果验证通过,则运行黑盒代码例程,基本上使用Request.Form(“NameHere”)读取数据。
我希望能够更改POST项的值,然后将其重新放回POST。我没有能力修改读取Request.Form(“NameHere”)的代码,因此我的想法是在页面的加载事件期间修改数据。如果我更改POST项的值,则不必修改黑盒代码。
是否可以更改HTTP POST上项目的值?
有没有人这样做过?
谢谢!
答案 0 :(得分:12)
即使它有点hacky,也有办法改变POST变量的值。
我们可以使用Reflection将Request.Form
集合标记为非readonly,将值更改为我们想要的值并再次将其标记为readonly(以便其他人无法更改值)。使用以下功能:
protected void SetFormValue(string key, string value)
{
var collection = HttpContext.Current.Request.Form;
// Get the "IsReadOnly" protected instance property.
var propInfo = collection.GetType().GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
// Mark the collection as NOT "IsReadOnly"
propInfo.SetValue(collection, false, new object[] { });
// Change the value of the key.
collection[key] = value;
// Mark the collection back as "IsReadOnly"
propInfo.SetValue(collection, true, new object[] { });
}
我在我的机器上测试了代码并且工作正常。但是,我无法提供任何性能或可移植性保证。
答案 1 :(得分:2)
当前的POST无法更改,但是,您可以创建新的POST请求并重定向到该请求。
答案 2 :(得分:1)
我认为这是将原始POST目标更改为您自己的POST目标的唯一方法,然后在您的代码中,所有发送到您地址的请求都会被分派到黑匣子地址。
虽然有一些开销。
据我记得,表单集是不可修改的,对吧?不记得确切的结构,但我认为
Request.Form("NameHere") = "newValue"
不起作用。
问候