2010-08-30 45 views
3

我正在开发一个应用程序,该应用程序是从最近从MVC 1/.NET 2/3.5升级到MVC2/.NET 4的另一个开发商店继承的。除了一页以外,一切正常。在这个页面上有一个加载了TinyMCE实例的iframe,并允许内联编辑一些HTML模板。在托管页面上,有一个连接到提交按钮的JavaScript事件,点击该按钮时,会捕获iframe的innerHtml值,将其转换为JSON并将其放置到隐藏的表单字段中。MVC 2和ASP.NET 4请求验证异常

随着形式的帖子我拿到检测到臭名昭著的“有潜在危险的Request.Form值......”现在我也跟着微软的白皮书,并添加

<httpRuntime requestValidationMode="2.0" /> 

为了我的web.config和装饰我的控制器,

[ValidateInput(false)] 

,我仍然收到此错误,有关堆栈的下面。

[HttpRequestValidationException (0x80004005): A potentially dangerous Request.Form value was detected from the client (HtmlContent="...orrectly? <a href=\"*|ARCHIVE|...").] 
System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) +8730676 
System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, RequestValidationSource requestCollection) +122 
System.Web.HttpRequest.get_Form() +114 
System.Web.HttpRequestWrapper.get_Form() +11 
System.Web.Mvc.HttpRequestExtensions.GetHttpMethodOverride(HttpRequestBase request) +235 
System.Web.Mvc.AcceptVerbsAttribute.IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) +119   
System.Web.Mvc.<>c__DisplayClass11.<RunSelectionFilters>b__d(ActionMethodSelectorAttribute attr) +57 
System.Linq.Enumerable.All(IEnumerable`1 source, Func`2 predicate) +145 
System.Web.Mvc.ActionMethodSelector.RunSelectionFilters(ControllerContext controllerContext, List`1 methodInfos) +524 
System.Web.Mvc.ActionMethodSelector.FindActionMethod(ControllerContext controllerContext, String actionName) +122 
System.Web.Mvc.ReflectedControllerDescriptor.FindAction(ControllerContext controllerContext, String actionName) +182 
System.Web.Mvc.ControllerActionInvoker.FindAction(ControllerContext controllerContext, ControllerDescriptor controllerDescriptor, String actionName) +47 
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +283 
System.Web.Mvc.Controller.ExecuteCore() +136 
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +111 
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +39 
System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +65 
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +44 
System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +42 
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +140 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +54 
System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40 
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +52 
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38 
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8836913 
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184 

有趣的是,如果我挂钩了Global.asax中的BeginRequest方法,这似乎表明代码在请求验证的2.0模式下运行,因为如果我对.NET 4s请求验证的理解是正确的,那么我不会如果代码在4.0验证模型下运行,则可以获得此方法,因为它在BeginRequest之前处理所有内容。

现在我可以通过从隐藏表单字段的值调用JavaScript函数中的escape()函数来绕过这个问题,但显然这是一个黑客行为。是否有其他人遇到过这个问题,或者有什么想法可以在我的控制器上正确禁用此方法的请求验证?

谢谢!

回答

0

检查是否在web.config中的 “页面” 一节的样子:

<pages validateRequest="false" ...>...</pages> 

如果不尝试添加validateRequest属性。它适用于我,因为我在几个月前遇到了同样的问题。

编辑:哈哈,我没有看到它是如此之旧的帖子。但我离开了我的answear,因为也许它可以帮助别人