2012-09-17 43 views
1

我已經創建了一個基本控制器,每個控制器都繼承。在這個控制器中我有OnActionExecuting方法。我用它來檢查一些參數的網址。我遇到的問題是,每當我發佈html數據時,都會收到異常。我已經使用[AllowHTML]標籤設置了模型,它適用於所有其他操作。數據驗證ASP MVC OnActionExecuting

如何使OnActionExecuting方法關注模型驗證?

這是我在我的基本控制器

public abstract class BaseController : Controller 
{ 
    [ValidateInput(false)] 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if ((Request.Params["api"] == null || string.IsNullOrEmpty(Request.Params["api"]))) 
      return; 

     if ((Request.Params["api"] != null && !string.IsNullOrEmpty(Request.Params["api"]))) 
     { 
      if (Session["api"] == null) 
      { 
       Session["api"] = Request.Params["api"]; 
      } 
     } 
    } 

以下是我的模型

[MetadataType(typeof (MessagingMetaData))] 
public partial class Message 
{ 

} 

public class MessagingMetaData 
{ 
    [Required] 
    [Display(Name = "Message")] 
    [DataType(DataType.Html)] 
    [AllowHtml] 
    public string Body { get; set; } 
} 

這裏的提取物的堆棧跟蹤

[System.Web.HttpRequestValidationException] 

Exception Message: A potentially dangerous Request.Form value was detected from the client (Content=" 

sdafdsafdsafdsac__DisplayClass12.b__d(String value, String key) at  Microsoft.Web.Infrastructure.DynamicValidationHelper.LazilyEvaluatedNameObjectEntry.ValidateObject() at Microsoft.Web.Infrastructure.DynamicValidationHelper.LazilyEvaluatedNameObjectEntry.GetValidatedObject() at Microsoft.Web.Infrastructure.DynamicValidationHelper.LazilyValidatingArrayList.get_Item(Int32 index) at System.Collections.Specialized.NameObjectCollectionBase.BaseGetKey(Int32 index) at System.Collections.Specialized.NameValueCollection.GetKey(Int32 index) at System.Collections.Specialized.NameValueCollection.Add(NameValueCollection c) at System.Web.HttpRequest.FillInParamsCollection() at System.Web.HttpRequest.GetParams() at System.Web.HttpRequest.get_Params() at System.Web.HttpRequestWrapper.get_Params() at ProjectX.BaseController.OnActionExecuting(ActionExecutingContext filterContext) at System.Web.Mvc.Controller.System.Web.Mvc.IActionFilter.OnActionExecuting(ActionExecutingContext filterContext) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<>c__DisplayClass17.b__14() at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) at System.Web.Mvc.Controller.ExecuteCore() at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.b__5() at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.b__0() at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.b__7(IAsyncResult _) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() at System.Web.Mvc.Async.AsyncResultWrapper.End[TResult](IAsyncResult asyncResult, Object tag) at System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) at System.Web.Mvc.MvcHandler.<>c__DisplayClasse.b__d() at System.Web.Mvc.SecurityUtil.b__0(Action f) at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

抱歉由於某種原因,佈局不會複製新行

回答

0

不知道這是否是問題的解決方案,但是可以解決這個問題。

通過改變Request.Params到的Request.QueryString我想確認是不是叫

public abstract class BaseController : Controller 
{ 
[ValidateInput(false)] 
protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if ((Request.QueryString["api"] == null || string.IsNullOrEmpty(Request.QueryString["api"]))) 
     return; 

    if ((Request.QueryString["api"] != null && !string.IsNullOrEmpty(Request.QueryString["api"]))) 
    { 
     if (Session["api"] == null) 
     { 
      Session["api"] = Request.Params["api"]; 
     } 
    } 
} 
1

我相信你應該可以使用Unvalidated()擴展方法。例如,將Request.Params["api"]更改爲Request.Unvalidated().Params["api"]

+0

我沒有未經驗證的()擴展方法,我使用.NET 4.0 –

+0

@MikeNorgate:這有用嗎? http://stackoverflow.com/a/4392314/120955 – StriplingWarrior

1

我知道這4年晚了,但我加入這個答案以供將來搜索。

你可以用Request.Unvalidated [ 「API」]

public abstract class BaseController : Controller 
{ 
    [ValidateInput(false)] 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if ((Request.Unvalidated["api"] == null || string.IsNullOrEmpty(Request.Unvalidated["api"]))) 
      return; 

     if ((Request.Unvalidated["api"] != null && !string.IsNullOrEmpty(Request.Unvalidated["api"]))) 
     { 
      if (Session["api"] == null) 
      { 
       Session["api"] = Request.Unvalidated["api"]; 
      } 
     } 
    } 
}