2009-04-30 25 views
33

webformsを使用して作成したアプリケーションを、vb.netを使用してasp.net mvcフレームワークに変換しています。私は私の意見の一つに問題があります。フォームを提出すると、「潜在的に危険なRequest.Form値がクライアントから検出されました」という黄色い画面が表示されます。私はRTEとしてtinymceを使用しています。私はMVCで、それは私がこれまで読んだからビューにそれを尊重していないことを知っているビュー自体にValidateInput(False)が機能しないのはなぜですか?

のvalidateRequest

=「false」に設定しています。だから私はコントローラのアクションにもそれを置く。

<ValidateInput(False)> _ 
<AcceptVerbs(HttpVerbs.Post)> _ 

ちょうどそれかどうかを確認するために...と、このようにも...

<ValidateInput(False), AcceptVerbs(HttpVerbs.Post)> _ 

...と...

<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _ 

:私は異なるセットアップを試してみました違いはありましたが、私はまだ黄色い死の幕が残っています。私はこのビューと私のポストが関係する私のコントローラの特定のアクションのためにそれを設定したいだけです。何か不足していますか?

答えて

17

投稿されたコントローラのアクションは、あなたが属性を持っているものですか?

+0

あなたは命の恩人です!私は昨日このプロジェクトに自分自身を燃やした。これは昨晩から私を悩ませていました。私はそれで寝ることが助けになると思いました。しかし、ええ、私のフォームアクションは私から空のそのビューで自分のjQueryの検証をテストし、私は戻ってUrl.Actionを置くことを忘れていた。私は恥ずかしい笑を感じる。 – Nurvx

+16

私たちはすべて間違いますが、誰もそれを学ぶことはありません。 :) –

+0

私の場合、 'Save(SomeModel model、string inputFromMemo)'のように、フルモデルといくつかの余分なパラメータを受け取るメソッドがあります。まず、 'Save(SomeModel model)'をコーディングしました。もう一方のパラメータを追加すると固定されました。 –

130

asp.net 4では、web.configで検証モードを設定する必要があります。

<system.web>要素の子として次のように設定します。

<system.Web> 
    ... 
    <httpRuntime requestValidationMode="2.0"/>  

Asp.Net 4は、HTTPリクエストのBeginRequst段階の前に、要求の検証を実行するためにシステムに指示され、デフォルトで4.0にrequestValidationModeを設定し、 。検証は、システムが要求を検証しないように指示するアクション属性に達する前に行われ、属性を無駄にします。 requestValidationMode = "2.0"を設定すると、asp.net 2.0要求の検証動作に戻り、ValidateInput属性が期待どおりに機能するようになります。

+17

これはMVC 3のために「固定」されるでしょうか? –

+0

優秀、これは私が必要としていたものです。ありがとう。 –

+8

2.0に戻す場合、他に注意すべき点はありますか? –

0

は、次の行を追加します。これは、ここにマルタインボーランドで非常にうまく説明されて

 // First check if request validation is required 
     var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled; 

     // Get value 
     var valueProviderResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation); 
     if (valueProviderResult != null) 
     { 
      var theValue = valueProviderResult.AttemptedValue; 

      // etc... 
     } 

: カスタムモデルバインダーは、アクションのValidateInputフィルタを尊重するために数行のコードを追加することができますコード:

GlobalFilters.Filters.Add(new ValidateInputAttribute(false)); 

をApplication_Start()メソッドに追加します。

+6

これは、すべてのコントローラーアクションの検証を無効にします。 –

1

あなたは HttpContext.Request.Unvalidated.Formのようにフィールドにアクセスしてみてくださいすることができます[「フィールド名」]

+0

する必要があります: HttpContext.Current.Request.Unvalidated.Form ["FieldName"] –

0

あなたが入力モデルを使用して、必要なプロパティにAllowHtmlを使用する場合は、ブロックを解除します。

public class InputModel 
{ 
    [AllowHtml] 
    public string HtmlInput { get; set; } 
} 

... 
[ValidateInput(false)] 
public async Task<ActionResult> ControllerMethod(InputModel model) 
{ 
} 
関連する問題