【问题标题】:Modifying MVC form collection parameters throwing NotSupportedException修改 MVC 表单集合参数抛出 NotSupportedException
【发布时间】:2011-08-24 21:21:46
【问题描述】:

我们有一个第三方控件,它两次发布相同的表单参数。我们现在想修补问题并通知他们,以便我们可以继续使用他们的控件。如何修改发布到 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/Module 来支持这个变化?我们希望在处理响应之前控制请求正文值。

【问题讨论】:

  • 我不认为你可以。但即使你可以,你打算在更新后对 request.Params 集合做什么?您可能需要考虑使用特定模型参数和自定义模型绑定器,以便控制它的创建方式。
  • Ben - 我尝试使用自定义模型绑定器来修改 FormCollection 参数,但这无济于事,因为专有的 CustomActionResult 没有使用模型 - 它只使用 Request.Form 所以它帮不上忙。

标签: c# asp.net-mvc asp.net-mvc-3 http-post


【解决方案1】:

你不能修改Request.Params,你也不应该修改。正如@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];
      }
   }
}

在你的action方法或者其他地方,

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

希望对你有帮助。

【讨论】:

  • 我不能使用参数或模型绑定器 - CustomActionResult 只会使用 Request.Form。听起来我需要在 IIS 流水线中使用更高级别的东西。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多