2

各コントローラーが継承するベースコントローラーを作成しました。このコントローラーには、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)

レイアウトが何らかの理由で新しい行をコピーしないことをお詫びします

4

3 に答える 3

2

Unvalidated()拡張方式が使えるはずだと思います。たとえば、に変更Request.Params["api"]Request.Unvalidated().Params["api"]ます。

于 2012-09-17T18:17:13.607 に答える
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"];
            }
        }
    }
}
于 2016-08-25T16:07:00.967 に答える
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"];
        }
    }
}
于 2012-09-17T23:14:15.593 に答える