修改抛出NotSupportedException的MVC表单集合参数

时间:2011-08-24 21:21:46

标签: 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"] = "some new value"; // NotSupportedException: Collection is read-only
    }
    return new CustomActionResult(this);
}

尝试更改请求参数不起作用 - 它会抛出NotSupportedException。有没有办法重定向此请求或我们是否需要一些自定义HTTPHandler /模块来支持此更改?我们希望在处理响应之前控制请求正文值。

2 个答案:

答案 0 :(得分:0)

您无法修改Request.Params,也不应该修改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); } 。正如@Ben所提到的,如果你需要复杂的绑定,那么使用参数或自定义ModelBinder会更好。

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];
      }
   }
}

或者如果你有理由不这样做,你可以为Params编写一个包装类,将逻辑放在该类中。因此,在修复第三方控件后很容易修改。

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

在您的行动方法或其他地方,

{{1}}

希望它可以提供帮助。

答案 1 :(得分:0)

感谢您的帮助,但我放弃了这个问题 - 因为它似乎无法实现它。我决定通过在客户端上使用jQuery提交表单之前删除重复的表单元素来解决问题。