2011-08-24 20 views
0

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

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来支持这个改变?我们希望在处理响应之前控制请求主体值。

+0

我不认为你可以。但即使可以,在您更新之后,您打算如何处理request.Params集合?您可能需要考虑使用特定的模型参数和自定义模型联编程序,以便控制其创建方式。 –

+0

本 - 我尝试使用自定义模型联编程序来修改FormCollection参数,但这没有帮助,因为专有的CustomActionResult没有使用模型 - 它只使用Request.Form,所以它不会帮助。 – SliverNinja

回答

0

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

0

你不能修改Request.Params,你也不应该。正如@Ben所提到的,如果您需要复杂的绑定,则使用参数或自定义ModelBinder会更好。或者如果你有一些不这样做的理由,你可以为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); 
} 

希望它可以帮助。

+0

我无法使用参数或模型联编程序 - CustomActionResult只会使用Request.Form。这听起来像我会需要更高的IIS流水线。 – SliverNinja

相关问题