【问题标题】:Data validation ASP MVC OnActionExecuting数据验证 ASP MVC OnActionExecuting
【发布时间】:2012-09-17 18:07:03
【问题描述】:

我创建了一个我的每个控制器都继承的基本控制器。在这个控制器中,我有 OnActionExecuting 方法。我用它来检查一些参数的 url。我遇到的问题是,每当我发布 html 数据时都会出现异常。我已经使用 [AllowHTML] 标签设置了模型,它适用于所有其他操作。

如何让 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)

抱歉,由于某种原因,布局不会复制新行

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    我相信您应该可以使用Unvalidated() 扩展方法。例如,将Request.Params["api"] 更改为Request.Unvalidated().Params["api"]

    【讨论】:

    • 我没有 Unvalidated() 扩展方法,因为我使用的是 .net 4.0
    【解决方案2】:

    我知道这已经晚了 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"];
                }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      不确定这是否是问题的解决方案,但可以解决。

      通过将 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"];
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-09-13
        • 1970-01-01
        • 2014-10-07
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 2011-07-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多