我们有第三方控件,它会两次发布相同的表单参数。我们想暂时解决问题并通知他们,以便我们继续使用他们的控件。如何修改发布到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 /模块来支持此更改?我们希望在处理响应之前控制请求正文值。
答案 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提交表单之前删除重复的表单元素来解决问题。