Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 修改MVC表单集合参数引发NotSupportedException_C#_Asp.net Mvc_Asp.net Mvc 3_Http Post - Fatal编程技术网

C# 修改MVC表单集合参数引发NotSupportedException

C# 修改MVC表单集合参数引发NotSupportedException,c#,asp.net-mvc,asp.net-mvc-3,http-post,C#,Asp.net Mvc,Asp.net Mvc 3,Http Post,我们有一个第三方控件,它两次发布相同的表单参数。我们现在想修补问题并通知他们,以便我们可以继续使用他们的控件。如何修改发布到MVC控制器操作方法的表单参数 public ActionResult Index() { var httpParams = this.HttpContext.Request.Params; if (httpParams["form_element"] != null ) { httpParams["form_element"] = "som

我们有一个第三方控件,它两次发布相同的表单参数。我们现在想修补问题并通知他们,以便我们可以继续使用他们的控件。如何修改发布到MVC控制器操作方法的表单参数

public ActionResult Index()
{
    var httpParams = this.HttpContext.Request.Params;
    if (httpParams["form_element"] != null ) {
        httpParams["form_element"] = "some new value"; // NotSupportedException: Collection is read-only
    }
    return new CustomActionResult(this);
}
尝试更改请求参数无效-它会引发NotSupportedException。是否有方法重定向此请求,或者我们是否需要一些定制的HTTPHandler/模块来支持此更改?我们希望在处理响应之前控制请求正文值。

您不能修改请求。参数,您也不应该修改。正如@Ben所提到的,如果需要复杂的绑定,最好使用参数或自定义ModelBinder

public ActionResult Index(string form_element)
{
    if (form_element != null ) {
        form_element = "some new value"; // not sure, why u need this. :)
    }

    return new CustomActionResult(this);
}
或者,如果您有不这样做的原因,您可以为Params编写一个包装类,将逻辑放在该类中。因此,在第三方控件固定后,很容易进行修改

public class ParamsWrapper
{
   private NameValueCollection _collection = new NameValueCollection();

   private static ParamsWrapper _instance;

   public static ParamsWrapper Instance {
       if(_instance == null) {
          _instance = new ParamsWrapper(HttpContext.Current.Request.Params);
       }

       return _instance;
   }

   public ParamsWrapper(NameValueCollection collection) {
      // added un-duplicated items to _collection from collection;
   }

   // put other methods that you want to interact
   // for example, 
   public string this[string name] {
      get {
          return _collection[name];
      }
   }
}
在你的行动方式或其他地方

public ActionResult Index()
{
    var httpParams = ParamsWrapper.Instance;
    return new CustomActionResult(this);
}

希望能有所帮助。

谢谢你的帮助,但我放弃了这个问题,因为似乎没有可能实现它。我决定在客户端上使用jQuery提交表单之前,先删除重复的表单元素来解决这个问题。

我认为你做不到。但是,即使可以,在更新request.Params集合后,您打算如何处理它?您可能想考虑使用特定的模型参数和定制的模型绑定器,这样您就可以控制它是如何创建的。本-我尝试使用自定义模型绑定器修改FULL集合参数,但是这没有帮助,因为专有的CustomActionResult没有使用模型-它只使用Request.Form,所以它没有帮助。我不能使用参数或模型绑定器-CustomActionResult将只使用Request.Form。听起来我需要IIS管道中更高层次的东西。