【问题标题】:How to add values to Request.Form collection如何向 Request.Form 集合添加值
【发布时间】:2012-11-08 06:04:21
【问题描述】:

我需要向 Request.Form 集合添加值,但我不明白如何使用指定的表单值初始化 HttpRequest 实例。我试图覆盖控制器中的Initialize 方法并像这样初始化HttpRequest

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
   var requestField = typeof (HttpRequestWrapper).GetField("_httpRequest", BindingFlags.NonPublic |
                                                                               BindingFlags.Instance);
   var responseField = typeof(HttpResponseWrapper).GetField("_httpResponse", BindingFlags.NonPublic | BindingFlags.Instance);


   var req = (HttpRequest) requestField.GetValue(requestContext.HttpContext.Request);
   var res = (HttpResponse)responseField.GetValue(requestContext.HttpContext.Response);
//**************** HERE I TRY TO INITIZLIZE FORM COLLECTION WITH MY VALUE 'additional_form_value' but nothing  
   var newReq = new HttpRequest(null, req.Url.ToString(), "?additional_form_value=test");
   newReq.RequestType = "POST";
//***************


   var r = new RequestContext(new HttpContextWrapper(new HttpContext(newReq, res)), requestContext.RouteData);


   base.Initialize(r);
}

有没有办法向Request.Form Collection 添加新项目?

编辑:

当我尝试这种方法时,我遇到了一个异常(对象引用未设置为对象的实例。):

NameValueCollection oQuery = requestContext.HttpContext.Request.QueryString;
oQuery = (NameValueCollection)requestContext.HttpContext.Request.GetType().GetField("_form", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(requestContext.HttpContext.Request); //exception here
PropertyInfo oReadable = oQuery.GetType().GetProperty("IsReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
oReadable.SetValue(oQuery, false, null);
oQuery["foo"] = "bar";
oReadable.SetValue(oQuery, true, null);

【问题讨论】:

  • 你在哪一行得到这个异常?
  • 第二个oQuery = (NameValueCollection)requestContext.HttpContext.Request.GetType().GetField("_form", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(requestContext.HttpContext.Request);
  • 你只是想在你的请求中添加数据还是你想做什么?我完全不明白您在编辑中要做什么(尽管我不是 Jon Skeet,所以这可能就是原因)。
  • 你确定你需要那个吗?因为在使用 MVC 时,您不需要处理 Form 集合或任何 Request 。您的操作将其参数作为函数参数接收,而不是作为表单值或查询字符串。
  • 我想这样做:controllerContext.RequestContext.HttpContext.Request.Form.Add("name","value");但我没有能力这样做,因为 Request.Form 是只读的,这就是为什么我尝试通过反射向 Request.From 添加值。

标签: c# asp.net-mvc reflection httprequest formcollection


【解决方案1】:

在将数据添加到帖子之前先建立数据。

您需要将数据添加到请求的流中,这样应该可以:

using(HttpWebRequest myHttpRequest = (HttpWebRequest)WebRequest.Create(myUrl)
{
   byte[] bytes = Encoding.UTF8.GetBytes(myFormData);
   Stream requestStream = null;
   try
   {
      myHttpRequest.ContentLength = bytes.Length;
      requestStream = myHttpRequest.GetRequestStream();
      requestStream.Write(bytes, 0, bytes.Length);
   }
}

您可能需要更改编码类型,但希望这对您有所帮助,除非我完全弄错了您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 2018-11-19
    • 2019-09-21
    • 1970-01-01
    相关资源
    最近更新 更多